{"posts":[{"fileName":"cpp-multi-thread","abstract":"<ul>\n<li>C++ 多线程封装，以及一些并发处理机制的资料</li>\n<li>持续更新ing</li>\n</ul>\n","description":" C++ 多线程封装，以及一些并发处理机制的资料 持续更新ing 参考链接 [1] CSDB: C++多线程之旅-atomic原子类型 [2] 菜鸟教程：C++ 多线程 [3] cplusplus.com - atomic [4] C...","title":"C++ 多线程","tags":[{"name":"编程语言","slug":"n2w6bz87h","used":true,"link":"https://blog.shunzi.tech/tag/n2w6bz87h/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20210513192958.png","link":"https://blog.shunzi.tech/post/cpp-multi-thread/","stats":{"text":"6 min read","time":308000,"words":1255,"minutes":6},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\">参考链接</a>\n<ul>\n<li><a href=\"#atomic\">atomic</a>\n<ul>\n<li><a href=\"#%E4%B8%BB%E8%A6%81%E6%93%8D%E4%BD%9C\">主要操作</a>\n<ul>\n<li><a href=\"#load\">load()</a></li>\n<li><a href=\"#store\">store()</a></li>\n<li><a href=\"#exchange-%E5%8E%9F%E5%AD%90%E6%93%8D%E4%BD%9C\">exchange() 原子操作</a></li>\n<li><a href=\"#compare_exchange_weak\">compare_exchange_weak()</a></li>\n<li><a href=\"#compare_exchange_strong\">compare_exchange_strong()</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2021-05-06 09:36:30","dateFormat":"2021-05-06"},{"fileName":"c-basic","abstract":"<ul>\n<li>C 语言基础汇总，主要包括一些容易混淆的、容易忘记的知识点，经常需要查询的。好吧，其实就是菜~</li>\n<li>持续更新ing</li>\n</ul>\n","description":" C 语言基础汇总，主要包括一些容易混淆的、容易忘记的知识点，经常需要查询的。好吧，其实就是菜~ 持续更新ing struct &amp; union 菜鸟教程 - C 结构体 菜鸟教程 - C 共用体 union 定义 union...","title":"C 基础","tags":[{"name":"编程语言","slug":"n2w6bz87h","used":true,"link":"https://blog.shunzi.tech/tag/n2w6bz87h/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20210513192631.png","link":"https://blog.shunzi.tech/post/c-basic/","stats":{"text":"8 min read","time":445000,"words":1824,"minutes":8},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#struct-union\">struct &amp; union</a>\n<ul>\n<li><a href=\"#union\">union</a>\n<ul>\n<li><a href=\"#%E5%AE%9A%E4%B9%89\">定义</a></li>\n<li><a href=\"#%E7%A4%BA%E4%BE%8B\">示例</a></li>\n<li><a href=\"#%E4%BD%9C%E7%94%A8\">作用</a></li>\n<li><a href=\"#%E5%A4%A7%E5%B0%8F%E5%88%86%E9%85%8D\">大小分配</a></li>\n</ul>\n</li>\n<li><a href=\"#struct\">struct</a>\n<ul>\n<li><a href=\"#%E5%AE%9A%E4%B9%89-2\">定义</a></li>\n<li><a href=\"#%E7%A4%BA%E4%BE%8B-2\">示例</a></li>\n<li><a href=\"#%E5%A4%A7%E5%B0%8F%E5%88%86%E9%85%8D-2\">大小分配</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2021-04-06 09:36:30","dateFormat":"2021-04-06"},{"fileName":"basic-of-concurrency-one","abstract":"<blockquote>\n<ul>\n<li>威斯康辛州大学操作系统书籍《Operating Systems: Three Easy Pieces》读书笔记系列之 Concurrency（并发）。本篇为并发技术的基础篇系列第三篇（Condition Variables），条件变量。</li>\n</ul>\n</blockquote>\n","description":" 威斯康辛州大学操作系统书籍《Operating Systems: Three Easy Pieces》读书笔记系列之 Concurrency（并发）。本篇为并发技术的基础篇系列第三篇（Condition Variables），条件变量。...","title":"Series Three of Basic of Concurrency - Condition Variables","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"读书笔记","slug":"la-n8a0mo","used":true,"link":"https://blog.shunzi.tech/tag/la-n8a0mo/"},{"name":"OS","slug":"os","used":true,"link":"https://blog.shunzi.tech/tag/os/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200717213648.png","link":"https://blog.shunzi.tech/post/basic-of-concurrency-one/","stats":{"text":"25 min read","time":1493000,"words":6296,"minutes":25},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#chapter-index\">Chapter Index</a></li>\n<li><a href=\"#condition-variables\">Condition Variables</a>\n<ul>\n<li><a href=\"#definition-and-routines\">Definition and Routines</a></li>\n<li><a href=\"#the-producerconsumer-bounded-buffer-problem\">The Producer/Consumer (Bounded Buffer) Problem</a>\n<ul>\n<li><a href=\"#a-broken-solution\">A Broken Solution</a></li>\n<li><a href=\"#better-but-still-broken-while-not-if\">Better, But Still Broken: While, Not If</a></li>\n<li><a href=\"#the-single-buffer-producerconsumer-solution\">The Single Buffer Producer/Consumer Solution</a></li>\n<li><a href=\"#the-correct-producerconsumer-solution\">The Correct Producer/Consumer Solution</a></li>\n</ul>\n</li>\n<li><a href=\"#covering-conditions\">Covering Conditions</a></li>\n<li><a href=\"#summary\">Summary</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2021-04-05 11:40:00","dateFormat":"2021-04-05"},{"fileName":"lock","abstract":"<blockquote>\n<ul>\n<li>编程中的锁。</li>\n<li>威斯康辛州大学操作系统书籍《Operating Systems: Three Easy Pieces》读书笔记系列之 Concurrency（并发）。本篇为并发技术的基础篇系列第二篇（Locks），锁。</li>\n</ul>\n</blockquote>\n","description":" 编程中的锁。 威斯康辛州大学操作系统书籍《Operating Systems: Three Easy Pieces》读书笔记系列之 Concurrency（并发）。本篇为并发技术的基础篇系列第二篇（Locks），锁。 Before...","title":"Lock of Programming","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"读书笔记","slug":"la-n8a0mo","used":true,"link":"https://blog.shunzi.tech/tag/la-n8a0mo/"},{"name":"OS","slug":"os","used":true,"link":"https://blog.shunzi.tech/tag/os/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200717213648.png","link":"https://blog.shunzi.tech/post/lock/","stats":{"text":"66 min read","time":3901000,"words":16859,"minutes":66},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#before\">Before</a></li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\">参考链接</a></li>\n<li><a href=\"#locks\">Locks</a>\n<ul>\n<li><a href=\"#locks-the-basic-idea\">Locks: The Basic Idea</a></li>\n<li><a href=\"#pthread-locks\">Pthread Locks</a></li>\n<li><a href=\"#building-a-lock\">Building A Lock</a></li>\n<li><a href=\"#evaluating-locks\">Evaluating Locks</a></li>\n<li><a href=\"#controlling-interrupts\">Controlling Interrupts</a></li>\n<li><a href=\"#a-failed-attempt-just-using-loadsstores\">A Failed Attempt: Just Using Loads/Stores</a></li>\n<li><a href=\"#building-working-spin-locks-with-test-and-set\">Building Working Spin Locks with Test-And-Set</a></li>\n<li><a href=\"#evaluating-spin-locks\">Evaluating Spin Locks</a></li>\n<li><a href=\"#compare-and-swap\">Compare-And-Swap</a></li>\n<li><a href=\"#load-linked-and-store-conditional\">Load-Linked and Store-Conditional</a></li>\n<li><a href=\"#fetch-and-add\">Fetch-And-Add</a></li>\n<li><a href=\"#too-much-spinning-what-now\">Too Much Spinning: What Now?</a></li>\n<li><a href=\"#a-simple-approach-just-yield-baby\">A Simple Approach: Just Yield, Baby</a></li>\n<li><a href=\"#using-queues-sleeping-instead-of-spinning\">Using Queues: Sleeping Instead Of Spinning</a></li>\n<li><a href=\"#different-os-different-support\">Different OS, Different Support</a></li>\n<li><a href=\"#two-phase-locks\">Two-Phase Locks</a></li>\n<li><a href=\"#summary\">Summary</a></li>\n</ul>\n</li>\n<li><a href=\"#lock-based-concurrent-data-structures\">Lock-based Concurrent Data Structures</a>\n<ul>\n<li><a href=\"#concurrent-counters\">Concurrent Counters</a>\n<ul>\n<li><a href=\"#scalable-counting\">Scalable Counting</a></li>\n</ul>\n</li>\n<li><a href=\"#concurrent-linked-lists\">Concurrent Linked Lists</a>\n<ul>\n<li><a href=\"#scaling-linked-lists\">Scaling Linked Lists</a></li>\n</ul>\n</li>\n<li><a href=\"#concurrent-queues\">Concurrent Queues</a></li>\n<li><a href=\"#concurrent-hash-table\">Concurrent Hash Table</a></li>\n<li><a href=\"#summary-2\">Summary</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2021-04-01 16:37:41","dateFormat":"2021-04-01"},{"fileName":"basic-of-concurrency-three","abstract":"<blockquote>\n<ul>\n<li>威斯康辛州大学操作系统书籍《Operating Systems: Three Easy Pieces》读书笔记系列之 Concurrency（并发）。本篇为并发技术的基础篇系列第一篇（Concurrency and Threads），并发和线程。</li>\n</ul>\n</blockquote>\n","description":" 威斯康辛州大学操作系统书籍《Operating Systems: Three Easy Pieces》读书笔记系列之 Concurrency（并发）。本篇为并发技术的基础篇系列第一篇（Concurrency and Threads），并...","title":"Series One of Basic of Concurrency - Concurrency and Threads","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"读书笔记","slug":"la-n8a0mo","used":true,"link":"https://blog.shunzi.tech/tag/la-n8a0mo/"},{"name":"OS","slug":"os","used":true,"link":"https://blog.shunzi.tech/tag/os/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200717213648.png","link":"https://blog.shunzi.tech/post/basic-of-concurrency-three/","stats":{"text":"1 min read","time":28000,"words":96,"minutes":1},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#chapter-index\">Chapter Index</a></li>\n</ul>\n</li>\n</ul>\n","date":"2021-03-28 11:40:00","dateFormat":"2021-03-28"},{"fileName":"SpanDB","abstract":"<blockquote>\n<ul>\n<li>FAST 2021 的文章《SpanDB: A Fast, Cost-Effective LSM-tree Based KV Store on Hybrid Storage》</li>\n</ul>\n</blockquote>\n","description":" FAST 2021 的文章《SpanDB: A Fast, Cost-Effective LSM-tree Based KV Store on Hybrid Storage》 SpanDB: A Fast, Cost-Effec...","title":"SpanDB: A Fast, Cost-Effective LSM-tree Based KV Store on Hybrid Storage","tags":[{"name":"Paper","slug":"5uQUdLlSC","used":true,"link":"https://blog.shunzi.tech/tag/5uQUdLlSC/"},{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"LSM","slug":"_jfuTNqah","used":true,"link":"https://blog.shunzi.tech/tag/_jfuTNqah/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20210301222754.png","link":"https://blog.shunzi.tech/post/SpanDB/","stats":{"text":"32 min read","time":1864000,"words":8466,"minutes":32},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#abstract\">Abstract</a></li>\n<li><a href=\"#introduction\">Introduction</a></li>\n<li><a href=\"#background-motivation\">Background &amp; Motivation</a>\n<ul>\n<li><a href=\"#lsm-tree-based-kv-stores\">LSM-tree based KV Stores</a></li>\n<li><a href=\"#group-wal-writes\">Group WAL Writes</a></li>\n<li><a href=\"#high-performance-ssds-interfaces\">High-Performance SSDs Interfaces</a>\n<ul>\n<li><a href=\"#spdk-%E6%95%B4%E4%BD%93%E6%80%A7%E8%83%BD\">SPDK 整体性能</a></li>\n<li><a href=\"#spdk-concurrency\">SPDK concurrency</a></li>\n<li><a href=\"#spdk-access-restrictions\">SPDK access restrictions</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#spandb-overview\">SpanDB Overview</a>\n<ul>\n<li><a href=\"#design-rationale\">Design rationale</a></li>\n<li><a href=\"#spandb-architecture\">SpanDB architecture</a></li>\n<li><a href=\"#sources-of-performance-benefits\">Sources of performance benefits</a></li>\n<li><a href=\"#limitations\">Limitations</a></li>\n</ul>\n</li>\n<li><a href=\"#design-and-implementation\">Design and Implementation</a>\n<ul>\n<li><a href=\"#asynchronous-request-processing\">Asynchronous Request Processing</a>\n<ul>\n<li><a href=\"#asynchronous-apis\">Asynchronous APIs</a></li>\n<li><a href=\"#spandb-request-processing\">SpanDB request processing</a></li>\n<li><a href=\"#task-scheduling\">Task scheduling</a></li>\n<li><a href=\"#transaction-support\">Transaction support</a></li>\n</ul>\n</li>\n<li><a href=\"#high-speed-logging-via-spdk\">High-speed Logging via SPDK</a>\n<ul>\n<li><a href=\"#enabling-parallelism-and-pipelining\">Enabling parallelism and pipelining</a></li>\n<li><a href=\"#log-data-management\">Log data management</a></li>\n<li><a href=\"#correctness\">Correctness</a></li>\n<li><a href=\"#log-recovery\">Log recovery</a></li>\n</ul>\n</li>\n<li><a href=\"#offloading-lsm-tree-levels-to-sd\">Offloading LSM-tree Levels to SD</a>\n<ul>\n<li><a href=\"#data-area-storage-organization\">Data area storage organization</a></li>\n<li><a href=\"#ensuring-wal-write-priority\">Ensuring WAL write priority</a></li>\n<li><a href=\"#spandb-spdk-cache\">SpanDB SPDK cache</a></li>\n<li><a href=\"#dynamic-level-placement\">Dynamic level placement</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#evaluation\">Evaluation</a></li>\n<li><a href=\"#related-work\">Related Work</a>\n<ul>\n<li><a href=\"#tiered-storage\">Tiered storage</a></li>\n<li><a href=\"#kv-stores-optimizations-for-fast-homogeneous-storage\">KV stores optimizations for fast, homogeneous storage</a>\n<ul>\n<li><a href=\"#homogeneous-storage\">homogeneous storage</a></li>\n<li><a href=\"#fpga\">FPGA</a></li>\n<li><a href=\"#pm\">PM</a></li>\n</ul>\n</li>\n<li><a href=\"#logging-optimizations\">Logging optimizations</a></li>\n<li><a href=\"#other-related-work\">Other related work</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2021-03-11 20:07:09","dateFormat":"2021-03-11"},{"fileName":"linux-software-mangement","abstract":"<blockquote>\n<ul>\n<li>Linux 软件包管理安装。</li>\n</ul>\n</blockquote>\n","description":" Linux 软件包管理安装。 参考书目/链接 Linux 就该这么学：Linux软件包管理基本操作入门 segmentfault: Linux系统中软件的“四”种安装原理详解 博客园：Linux下rpm、yum和源码三种安装方式...","title":"Linux Software Management","tags":[{"name":"工具","slug":"hbaTDSglx-","used":true,"link":"https://blog.shunzi.tech/tag/hbaTDSglx-/"},{"name":"Linux","slug":"EO3XpMf_y","used":true,"link":"https://blog.shunzi.tech/tag/EO3XpMf_y/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20210226165557.png","link":"https://blog.shunzi.tech/post/linux-software-mangement/","stats":{"text":"14 min read","time":804000,"words":2988,"minutes":14},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#%E5%8F%82%E8%80%83%E4%B9%A6%E7%9B%AE%E9%93%BE%E6%8E%A5\">参考书目/链接</a></li>\n<li><a href=\"#%E8%BD%AF%E4%BB%B6%E5%8C%85\">软件包</a>\n<ul>\n<li><a href=\"#windows\">Windows</a></li>\n<li><a href=\"#linux\">Linux</a></li>\n</ul>\n</li>\n<li><a href=\"#linux-%E8%BD%AF%E4%BB%B6%E5%8C%85%E7%AE%A1%E7%90%86\">Linux 软件包管理</a>\n<ul>\n<li><a href=\"#%E8%BD%AF%E4%BB%B6%E5%8C%85%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F\">软件包管理系统</a></li>\n<li><a href=\"#%E5%B8%B8%E8%A7%81%E6%93%8D%E4%BD%9C\">常见操作</a></li>\n<li><a href=\"#%E6%9C%AC%E5%9C%B0%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85\">本地文件系统安装</a>\n<ul>\n<li><a href=\"#%E4%BB%8E%E6%9C%AC%E5%9C%B0%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E7%9B%B4%E6%8E%A5%E5%AE%89%E8%A3%85%E5%8C%85\">从本地文件系统直接安装包</a>\n<ul>\n<li><a href=\"#%E6%9C%AC%E5%9C%B0%E5%AE%89%E8%A3%85%E5%91%BD%E4%BB%A4\">本地安装命令</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#rpm\">RPM</a>\n<ul>\n<li><a href=\"#%E6%9E%84%E5%BB%BA%E6%B5%81%E7%A8%8B\">构建流程</a>\n<ul>\n<li><a href=\"#%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84\">目录结构</a></li>\n<li><a href=\"#%E5%87%86%E5%A4%87%E6%96%87%E4%BB%B6\">准备文件</a></li>\n<li><a href=\"#%E6%9E%84%E5%BB%BA-rpm\">构建 RPM</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%AE%89%E8%A3%85%E6%B5%81%E7%A8%8B\">安装流程</a>\n<ul>\n<li><a href=\"#%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86\">错误处理</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2021-02-26 16:37:41","dateFormat":"2021-02-26"},{"fileName":"ReadingGroup","abstract":"<blockquote>\n<ul>\n<li>参加 Systems Reading Group 记录的论文笔记。</li>\n</ul>\n</blockquote>\n","description":" 参加 Systems Reading Group 记录的论文笔记。 System Reading Group Group 介绍以及 Presentation 安排： https://learn-sys.github.io/cn/...","title":"Reading Group Notes","tags":[{"name":"cs-course","slug":"wAFV_pvXZ","used":true,"link":"https://blog.shunzi.tech/tag/wAFV_pvXZ/"},{"name":"Paper","slug":"5uQUdLlSC","used":true,"link":"https://blog.shunzi.tech/tag/5uQUdLlSC/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20210220221954.png","link":"https://blog.shunzi.tech/post/ReadingGroup/","stats":{"text":"5 min read","time":261000,"words":1130,"minutes":5},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li><a href=\"#system-reading-group\">System Reading Group</a>\n<ul>\n<li><a href=\"#week-1-operating-system\">Week 1: Operating System</a>\n<ul>\n<li><a href=\"#course-notes\">Course Notes</a>\n<ul>\n<li><a href=\"#os-architecture-structure\">OS Architecture &amp; Structure</a></li>\n</ul>\n</li>\n<li><a href=\"#paper-1-the-multikernel-a-new-os-architecture-for-scalable-multicore-systems\">Paper 1: The Multikernel: A new OS architecture for scalable multicore systems</a>\n<ul>\n<li><a href=\"#abstract\">Abstract</a></li>\n<li><a href=\"#problems\">Problems</a></li>\n<li><a href=\"#contributions\">Contributions</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#week-2-virtualization\">Week 2: Virtualization</a>\n<ul>\n<li><a href=\"#course-notes-2\">Course Notes</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2021-02-19 16:37:41","dateFormat":"2021-02-19"},{"fileName":"MapReduce","abstract":"<blockquote>\n<ul>\n<li>该篇文章来自于 OSDI2004，Google 当年率先提出的 MapReduce 框架，开启了分布式和大数据的纪元。</li>\n</ul>\n</blockquote>\n","description":" 该篇文章来自于 OSDI2004，Google 当年率先提出的 MapReduce 框架，开启了分布式和大数据的纪元。 Before Beginning 为什么要读这篇论文呢？其实这篇文章之前也已经简单看过了，只是最近开始刷 M...","title":"MapReduce: Simplified Data Processing on Large Clusters","tags":[{"name":"cs-course","slug":"wAFV_pvXZ","used":true,"link":"https://blog.shunzi.tech/tag/wAFV_pvXZ/"},{"name":6.824,"slug":"VqiGqmxbod","used":true,"link":"https://blog.shunzi.tech/tag/VqiGqmxbod/"},{"name":"Paper","slug":"5uQUdLlSC","used":true,"link":"https://blog.shunzi.tech/tag/5uQUdLlSC/"},{"name":"分布式","slug":"geK0jEW-T","used":true,"link":"https://blog.shunzi.tech/tag/geK0jEW-T/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20210208135434.png","link":"https://blog.shunzi.tech/post/MapReduce/","stats":{"text":"25 min read","time":1486000,"words":6571,"minutes":25},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#before-beginning\">Before Beginning</a></li>\n<li><a href=\"#abstract\">Abstract</a></li>\n<li><a href=\"#introduction\">Introduction</a></li>\n<li><a href=\"#programming-model\">Programming Model</a></li>\n<li><a href=\"#implementation\">Implementation</a>\n<ul>\n<li><a href=\"#master-data-structures\">Master Data Structures</a></li>\n<li><a href=\"#fault-tolerance\">Fault Tolerance</a>\n<ul>\n<li><a href=\"#worker-failure\">Worker Failure</a></li>\n<li><a href=\"#master-failure\">Master Failure</a></li>\n<li><a href=\"#semantics-in-the-presence-of-failures\">Semantics in the Presence of Failures</a></li>\n</ul>\n</li>\n<li><a href=\"#locality\">Locality</a></li>\n<li><a href=\"#task-granularity\">Task Granularity</a></li>\n<li><a href=\"#backup-tasks\">Backup Tasks</a></li>\n</ul>\n</li>\n<li><a href=\"#refinements\">Refinements</a>\n<ul>\n<li><a href=\"#partitioning-function\">Partitioning Function</a></li>\n<li><a href=\"#ordering-guarantees\">Ordering Guarantees</a></li>\n<li><a href=\"#combiner-function\">Combiner Function</a></li>\n<li><a href=\"#input-and-output-types\">Input and Output Types</a></li>\n<li><a href=\"#side-effects\">Side-effects</a></li>\n<li><a href=\"#skipping-bad-records\">Skipping Bad Records</a></li>\n<li><a href=\"#local-execution\">Local Execution</a></li>\n<li><a href=\"#status-information\">Status Information</a></li>\n<li><a href=\"#counters\">Counters</a></li>\n</ul>\n</li>\n<li><a href=\"#conclusion\">Conclusion</a></li>\n<li><a href=\"#other\">Other</a>\n<ul>\n<li><a href=\"#problems\">Problems</a></li>\n<li><a href=\"#current-status\">Current status</a></li>\n<li><a href=\"#conclusion-2\">Conclusion</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2021-02-08 16:37:41","dateFormat":"2021-02-08"},{"fileName":"license","abstract":"<blockquote>\n<ul>\n<li>什么是源代码许可？以及如何选择源代码许可？困扰了很久的问题，查了下资料决定把这个坑埋了。</li>\n</ul>\n</blockquote>\n","description":" 什么是源代码许可？以及如何选择源代码许可？困扰了很久的问题，查了下资料决定把这个坑埋了。 开源许可长啥样？ 我们常常在 Github 上看到关于 License 的信息，仿佛 NB 点的项目都挂了个 License（啊没有不挂就...","title":"What is license for source code?","tags":[{"name":"工具","slug":"hbaTDSglx-","used":true,"link":"https://blog.shunzi.tech/tag/hbaTDSglx-/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20210206231108.png","link":"https://blog.shunzi.tech/post/license/","stats":{"text":"11 min read","time":612000,"words":2773,"minutes":11},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li>\n<ul>\n<li><a href=\"#%E5%BC%80%E6%BA%90%E8%AE%B8%E5%8F%AF%E9%95%BF%E5%95%A5%E6%A0%B7\">开源许可长啥样？</a></li>\n<li><a href=\"#%E5%88%B0%E5%BA%95%E5%95%A5%E6%98%AF%E5%BC%80%E6%BA%90%E8%AE%B8%E5%8F%AF\">到底啥是开源许可？</a>\n<ul>\n<li><a href=\"#copyrightc\">Copyright(C)</a></li>\n<li><a href=\"#copyleft%C9%94\">Copyleft(Ɔ)</a></li>\n<li><a href=\"#license\">License</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%9C%89%E5%93%AA%E4%BA%9B%E5%BC%80%E6%BA%90%E8%AE%B8%E5%8F%AF\">有哪些开源许可</a>\n<ul>\n<li><a href=\"#other\">Other</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%80%8E%E4%B9%88%E9%80%89%E5%BC%80%E6%BA%90%E8%AE%B8%E5%8F%AF\">怎么选开源许可</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2021-02-06 16:37:41","dateFormat":"2021-02-06"},{"fileName":"Dostoevsky","abstract":"<blockquote>\n<ul>\n<li>SIGMMOD18 Dostoevsky: Better Space-Time Trade-Offs for LSM-Tree Based<br>\nKey-Value Stores via Adaptive Removal of Superfluous Merging</li>\n</ul>\n</blockquote>\n","description":" SIGMMOD18 Dostoevsky: Better Space-Time Trade-Offs for LSM-Tree Based Key-Value Stores via Adaptive Removal of Superfl...","title":"Dostoevsky: Better Space-Time Trade-Offs for LSM-Tree Based Key-Value Stores via Adaptive Removal of Superfluous Merging","tags":[{"name":"KVS","slug":"l8sKsLUAi","used":true,"link":"https://blog.shunzi.tech/tag/l8sKsLUAi/"},{"name":"Paper","slug":"5uQUdLlSC","used":true,"link":"https://blog.shunzi.tech/tag/5uQUdLlSC/"},{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20210112173749.png","link":"https://blog.shunzi.tech/post/Dostoevsky/","stats":{"text":"26 min read","time":1540000,"words":6863,"minutes":26},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#abstract\">Abstract</a></li>\n<li><a href=\"#introduction\">Introduction</a></li>\n<li><a href=\"#background\">BACKGROUND</a></li>\n<li><a href=\"#design-space-and-problem-analysis\">DESIGN SPACE AND PROBLEM ANALYSIS</a></li>\n<li><a href=\"#lazy-leveling-fluid-lsm-tree-and-dostoevsky\">LAZY LEVELING, FLUID LSM-TREE, AND DOSTOEVSKY</a>\n<ul>\n<li><a href=\"#lazy-leveling\">Lazy Leveling</a></li>\n<li><a href=\"#fluid-lsm-tree\">Fluid LSM-Tree</a></li>\n</ul>\n</li>\n<li><a href=\"#references\">References</a></li>\n</ul>\n</li>\n</ul>\n","date":"2021-01-12 22:50:15","dateFormat":"2021-01-12"},{"fileName":"CRaft","abstract":"<blockquote>\n<ul>\n<li>FAST2020 主要是利用纠删码基于 Raft 进行优化，降低一致性开销</li>\n</ul>\n</blockquote>\n","description":" FAST2020 主要是利用纠删码基于 Raft 进行优化，降低一致性开销 Abstract 一致性协议主要是在分布式系统中用于保证可靠性和可用性的，现有的一致性协议大多都是要将日志项给备份到所有的服务器中，这种全量的副本的策略...","title":"CRaft: An Erasure-coding-supported Version of Raft for Reducing Storage Cost and Network Cost","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"分布式","slug":"geK0jEW-T","used":true,"link":"https://blog.shunzi.tech/tag/geK0jEW-T/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200614213040.png","link":"https://blog.shunzi.tech/post/CRaft/","stats":{"text":"8 min read","time":458000,"words":2087,"minutes":8},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#abstract\">Abstract</a></li>\n<li><a href=\"#introduction\">Introduction</a></li>\n<li><a href=\"#background\">Background</a>\n<ul>\n<li><a href=\"#raft\">Raft</a></li>\n<li><a href=\"#erasure-coding\">Erasure Coding</a></li>\n<li><a href=\"#rs-paxos\">RS-Paxos</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-12-16 11:40:00","dateFormat":"2020-12-16"},{"fileName":"Alluxio","abstract":"<blockquote>\n<ul>\n<li>Alluxio 简单介绍，测试报告，然后会结合一些实际体验。</li>\n</ul>\n</blockquote>\n","description":" Alluxio 简单介绍，测试报告，然后会结合一些实际体验。 Alluxio Alluxio（之前名为 Tachyon），是一个开源的具有内存级速度的虚拟分布式存储系统， 使得应用程序可以以内存级速度与任何存储系统中的数据进行交...","title":"Alluxio","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"缓存","slug":"9msH-lUaA","used":true,"link":"https://blog.shunzi.tech/tag/9msH-lUaA/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20201210191906.png","link":"https://blog.shunzi.tech/post/Alluxio/","stats":{"text":"17 min read","time":992000,"words":4077,"minutes":17},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li><a href=\"#alluxio\">Alluxio</a>\n<ul>\n<li><a href=\"#%E6%9E%B6%E6%9E%84\">架构</a>\n<ul>\n<li><a href=\"#%E8%A7%92%E8%89%B2\">角色</a>\n<ul>\n<li><a href=\"#master\">Master</a></li>\n<li><a href=\"#worker\">Worker</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#features\">Features</a>\n<ul>\n<li><a href=\"#%E5%85%A8%E5%B1%80%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4\">全局命名空间</a></li>\n<li><a href=\"#%E6%99%BA%E8%83%BD%E5%A4%9A%E5%B1%82%E7%BA%A7%E7%BC%93%E5%AD%98\">智能多层级缓存</a>\n<ul>\n<li><a href=\"#%E5%8D%95%E5%B1%82%E5%AD%98%E5%82%A8\">单层存储</a></li>\n<li><a href=\"#%E5%A4%9A%E5%B1%82%E5%AD%98%E5%82%A8\">多层存储</a>\n<ul>\n<li><a href=\"#block-allocation-policies\">Block Allocation Policies</a></li>\n<li><a href=\"#experimental-block-allocation-review-policies\">[Experimental] Block Allocation Review Policies</a></li>\n<li><a href=\"#block-annotation-policies\">Block Annotation Policies</a></li>\n</ul>\n</li>\n<li><a href=\"#managing-data-replication-in-alluxio\">Managing Data Replication in Alluxio</a>\n<ul>\n<li><a href=\"#passive-replication\">Passive Replication</a></li>\n<li><a href=\"#active-replication\">Active Replication</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#evaluation\">Evaluation</a>\n<ul>\n<li><a href=\"#testing-alluxio-for-memory-speed-computation-on-ceph-objects\">Testing Alluxio for Memory Speed Computation on Ceph Objects</a>\n<ul>\n<li><a href=\"#%E7%8E%AF%E5%A2%83%E4%BB%8B%E7%BB%8D\">环境介绍</a></li>\n<li><a href=\"#%E6%B5%8B%E8%AF%95%E7%BB%93%E6%9E%9C\">测试结果：</a></li>\n</ul>\n</li>\n<li><a href=\"#accelerate-and-scale-big-data-analytics-with-alluxio-and-inteloptanetm-persistent-memory\">Accelerate And Scale Big Data AnAlytics with Alluxio And intel®optane™ persistent Memory</a></li>\n<li><a href=\"#reliability-testing\">Reliability Testing</a></li>\n</ul>\n</li>\n<li><a href=\"#install-deploy\">Install &amp; Deploy</a>\n<ul>\n<li><a href=\"#single-server\">Single Server</a>\n<ul>\n<li><a href=\"#download\">Download</a></li>\n<li><a href=\"#initial-config\">Initial Config</a></li>\n<li><a href=\"#start-alluxio\">Start Alluxio</a>\n<ul>\n<li><a href=\"#verify\">Verify</a></li>\n<li><a href=\"#run-tests\">Run tests</a></li>\n</ul>\n</li>\n<li><a href=\"#simple-example\">Simple Example</a>\n<ul>\n<li><a href=\"#upload-files-from-local-server\">Upload files from local server</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#references\">References</a></li>\n</ul>\n</li>\n</ul>\n","date":"2020-12-10 10:21:17","dateFormat":"2020-12-10"},{"fileName":"osdi-Bourbon","abstract":"<blockquote>\n<ul>\n<li>该篇文章来自于 OSDI2020 From WiscKey to Bourbon: A Learned Index for Log-Structured Merge Trees</li>\n</ul>\n</blockquote>\n","description":" 该篇文章来自于 OSDI2020 From WiscKey to Bourbon: A Learned Index for Log-Structured Merge Trees 很久没看 LSM tree 的文章了，恰好这几天...","title":"From WiscKey to Bourbon: A Learned Index for Log-Structured Merge Trees","tags":[{"name":"Paper","slug":"5uQUdLlSC","used":true,"link":"https://blog.shunzi.tech/tag/5uQUdLlSC/"},{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"LSM","slug":"_jfuTNqah","used":true,"link":"https://blog.shunzi.tech/tag/_jfuTNqah/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20201107165512.png","link":"https://blog.shunzi.tech/post/osdi-Bourbon/","stats":{"text":"39 min read","time":2285000,"words":10576,"minutes":39},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#abstract\">Abstract</a></li>\n<li><a href=\"#introduction\">Introduction</a><br>\n*\n<ul>\n<li><a href=\"#%E5%AD%A6%E4%B9%A0%E7%B4%A2%E5%BC%95%E6%98%AF%E4%B8%AA%E5%95%A5\">学习索引是个啥？</a></li>\n<li><a href=\"#%E5%AD%A6%E4%B9%A0%E7%B4%A2%E5%BC%95%E5%92%8C-lsms-%E8%83%BD%E6%93%A6%E5%87%BA%E5%95%A5%E7%81%AB%E8%8A%B1\">学习索引和 LSMs 能擦出啥火花？</a>\n<ul>\n<li><a href=\"#%E4%B8%A4%E8%80%85%E7%90%86%E8%AE%BA%E4%B8%8A%E7%9A%84%E7%9F%9B%E7%9B%BE\">两者理论上的矛盾</a></li>\n<li><a href=\"#bourbon-%E5%81%9A%E4%BA%86%E5%95%A5\">Bourbon 做了啥</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#background\">Background</a>\n<ul>\n<li><a href=\"#lsm-leveldb\">LSM &amp; LevelDB</a></li>\n<li><a href=\"#wisckey\">WiscKey</a></li>\n<li><a href=\"#optimizing-lookups-in-lsms\">Optimizing Lookups in LSMs</a></li>\n</ul>\n</li>\n<li><a href=\"#learned-indexes-a-good-match-for-lsms\">Learned Indexes: a Good Match for LSMs?</a>\n<ul>\n<li><a href=\"#learned-indexes-beneficial-regimes\">Learned Indexes: Beneficial Regimes</a></li>\n<li><a href=\"#learned-indexes-with-writes\">Learned Indexes with Writes</a>\n<ul>\n<li><a href=\"#sstable-lifetimes\">SSTable Lifetimes</a></li>\n<li><a href=\"#number-of-internal-lookups-per-file\">Number of Internal Lookups Per File</a></li>\n<li><a href=\"#lifetime-of-levels\">Lifetime of Levels</a></li>\n</ul>\n</li>\n<li><a href=\"#summary\">Summary</a></li>\n</ul>\n</li>\n<li><a href=\"#bourbon-design\">Bourbon Design</a>\n<ul>\n<li><a href=\"#learning-the-data\">Learning the Data</a></li>\n<li><a href=\"#supporting-variable-size-values\">Supporting Variable-size Values</a></li>\n<li><a href=\"#level-vs-file-learning\">Level vs. File Learning</a></li>\n<li><a href=\"#cost-vs-benefit-analyzer\">Cost vs. Benefit Analyzer</a>\n<ul>\n<li><a href=\"#wait-before-learning\">Wait Before Learning</a></li>\n<li><a href=\"#to-learn-a-file-or-not\">To Learn a File or Not</a>\n<ul>\n<li><a href=\"#estimating-c_model\">Estimating <span class=\"katex\"><span class=\"katex-mathml\"><math><semantics><mrow><msub><mi>C</mi><mrow><mi>m</mi><mi>o</mi><mi>d</mi><mi>e</mi><mi>l</mi></mrow></msub></mrow><annotation encoding=\"application/x-tex\">C_{model}</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.83333em;vertical-align:-0.15em;\"></span><span class=\"mord\"><span class=\"mord mathdefault\" style=\"margin-right:0.07153em;\">C</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.33610799999999996em;\"><span style=\"top:-2.5500000000000003em;margin-left:-0.07153em;margin-right:0.05em;\"><span class=\"pstrut\" style=\"height:2.7em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathdefault mtight\">m</span><span class=\"mord mathdefault mtight\">o</span><span class=\"mord mathdefault mtight\">d</span><span class=\"mord mathdefault mtight\">e</span><span class=\"mord mathdefault mtight\" style=\"margin-right:0.01968em;\">l</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em;\"><span></span></span></span></span></span></span></span></span></span></a></li>\n<li><a href=\"#estimating-b_model\">Estimating <span class=\"katex\"><span class=\"katex-mathml\"><math><semantics><mrow><msub><mi>B</mi><mrow><mi>m</mi><mi>o</mi><mi>d</mi><mi>e</mi><mi>l</mi></mrow></msub></mrow><annotation encoding=\"application/x-tex\">B_{model}</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.83333em;vertical-align:-0.15em;\"></span><span class=\"mord\"><span class=\"mord mathdefault\" style=\"margin-right:0.05017em;\">B</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.33610799999999996em;\"><span style=\"top:-2.5500000000000003em;margin-left:-0.05017em;margin-right:0.05em;\"><span class=\"pstrut\" style=\"height:2.7em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathdefault mtight\">m</span><span class=\"mord mathdefault mtight\">o</span><span class=\"mord mathdefault mtight\">d</span><span class=\"mord mathdefault mtight\">e</span><span class=\"mord mathdefault mtight\" style=\"margin-right:0.01968em;\">l</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em;\"><span></span></span></span></span></span></span></span></span></span></a></li>\n</ul>\n</li>\n<li><a href=\"#bourbon-putting-it-all-together\">Bourbon: Putting it All Together</a>\n<ul>\n<li><a href=\"#possible-improvements\">Possible improvements</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#evaluation\">Evaluation</a>\n<ul>\n<li><a href=\"#%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83\">测试环境</a>\n<ul>\n<li><a href=\"#%E7%A1%AC%E4%BB%B6%E7%8E%AF%E5%A2%83\">硬件环境</a></li>\n<li><a href=\"#%E7%B3%BB%E7%BB%9F%E5%8F%82%E6%95%B0\">系统参数</a></li>\n<li><a href=\"#%E8%B4%9F%E8%BD%BD\">负载</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%B5%8B%E8%AF%95%E7%BB%93%E6%9E%9C\">测试结果</a></li>\n</ul>\n</li>\n<li><a href=\"#related-work\">Related Work</a></li>\n</ul>\n</li>\n</ul>\n","date":"2020-11-06 16:37:41","dateFormat":"2020-11-06"},{"fileName":"intelligent-cache-research","abstract":"<blockquote>\n<ul>\n<li>本篇为智能缓存相关的研究调研，可能涉及 AI for System 以及相关缓存策略的设计</li>\n</ul>\n</blockquote>\n","description":" 本篇为智能缓存相关的研究调研，可能涉及 AI for System 以及相关缓存策略的设计 Smart SSD Cache 智能缓存顾名思义为不同的负载下提供相应的缓存策略来保证缓存的高效，主要包含多种缓存策略执行和 IO ...","title":"intelligent cache research","tags":[{"name":"缓存","slug":"9msH-lUaA","used":true,"link":"https://blog.shunzi.tech/tag/9msH-lUaA/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200714201124.png","link":"https://blog.shunzi.tech/post/intelligent-cache-research/","stats":{"text":"16 min read","time":911000,"words":4209,"minutes":16},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#smart-ssd-cache\">Smart SSD Cache</a>\n<ul>\n<li><a href=\"#oceanstor-v5-%E7%B3%BB%E5%88%97-v500r007-smartcache\">OceanStor V5 系列 V500R007 SmartCache</a>\n<ul>\n<li><a href=\"#%E5%AE%9A%E4%B9%89\">定义</a></li>\n<li><a href=\"#%E5%9C%BA%E6%99%AF\">场景</a></li>\n<li><a href=\"#%E5%8E%9F%E7%90%86\">原理</a>\n<ul>\n<li><a href=\"#%E6%99%BA%E8%83%BD%E7%BC%93%E5%AD%98%E6%B1%A0\">智能缓存池</a></li>\n<li><a href=\"#%E8%AF%BB%E6%B5%81%E7%A8%8B\">读流程</a></li>\n<li><a href=\"#smartcache%E5%88%86%E5%8C%BA\">SmartCache分区</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#machine-learning\">Machine Learning</a>\n<ul>\n<li><a href=\"#date20-a-machine-learning-based-write-policy-for-ssd-cache-in-cloud-block-storage\">DATE20 - A Machine Learning Based Write Policy for SSD Cache in Cloud Block Storage</a>\n<ul>\n<li><a href=\"#related-work\">Related Work</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#new-cache-policy\">New Cache Policy</a>\n<ul>\n<li><a href=\"#tpds20-efficient-ssd-cache-for-cloud-block-storage-via-leveraging-block-reuse-distances\">TPDS20 - Efficient SSD Cache for Cloud Block Storage via Leveraging Block Reuse Distances</a>\n<ul>\n<li><a href=\"#lea-algorithm\">LEA Algorithm</a></li>\n</ul>\n</li>\n<li><a href=\"#atc20-osca-an-online-model-based-cache-allocation-scheme-in-cloud-block-storage-systems\">ATC20 - OSCA: An Online-Model Based Cache Allocation Scheme in Cloud Block Storage Systems</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-10-25 23:59:49","dateFormat":"2020-10-25"},{"fileName":"CephFS","abstract":"<blockquote>\n<ul>\n<li>一个项目测试使用到了 CephFS，故简要整理 CephFS 资料和相关文档</li>\n</ul>\n</blockquote>\n","description":" 一个项目测试使用到了 CephFS，故简要整理 CephFS 资料和相关文档 CephFS Ceph 常用命令 Deploy a Ceph Cluster Manually Overview CephFS 应用相比于 RBD...","title":"Ceph FS 介绍和使用","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"Ceph","slug":"i2b42Y2j6","used":true,"link":"https://blog.shunzi.tech/tag/i2b42Y2j6/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200830135706.png","link":"https://blog.shunzi.tech/post/CephFS/","stats":{"text":"10 min read","time":546000,"words":2519,"minutes":10},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#cephfs\">CephFS</a>\n<ul>\n<li><a href=\"#overview\">Overview</a></li>\n<li><a href=\"#%E8%83%8C%E6%99%AF\">背景</a>\n<ul>\n<li><a href=\"#%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E6%95%B0%E6%8D%AE%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%88%86%E5%8C%BA\">文件系统数据负载均衡分区</a>\n<ul>\n<li><a href=\"#%E9%9D%99%E6%80%81%E5%AD%90%E6%A0%91%E5%88%86%E5%8C%BA\">静态子树分区</a></li>\n<li><a href=\"#hash-%E8%AE%A1%E7%AE%97%E5%88%86%E5%8C%BA\">HASH 计算分区</a></li>\n<li><a href=\"#%E5%8A%A8%E6%80%81%E5%AD%90%E6%A0%91%E5%88%86%E5%8C%BA\">动态子树分区</a></li>\n</ul>\n</li>\n<li><a href=\"#cephfs-mds-%E7%89%B9%E7%82%B9\">CephFS MDS 特点</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%9E%B6%E6%9E%84\">架构</a>\n<ul>\n<li><a href=\"#cepgfs-client-%E8%AE%BF%E9%97%AE%E7%A4%BA%E4%BE%8B\">CepgFS Client 访问示例</a></li>\n<li><a href=\"#mds-%E6%96%87%E4%BB%B6%E9%94%81\">MDS 文件锁</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\">参考链接</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-10-14 20:32:20","dateFormat":"2020-10-14"},{"fileName":"fast20-some","abstract":"<ul>\n<li>FAST20 Overview</li>\n</ul>\n","description":" FAST20 Overview 最近进入了一个怠惰期，一是苦于没有明确的研究方向，二是沉湎于琐碎小事，所以科研上很多事情都被搁置 遇到了问题就总得寻找解决的办法，所以决定还是好好看几篇论文，看看能不能找到感兴趣的点，再深入挖掘 最...","title":"FAST20 Some Interesting Papers Overview","tags":[{"name":"Paper","slug":"5uQUdLlSC","used":true,"link":"https://blog.shunzi.tech/tag/5uQUdLlSC/"},{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20201016163845.png","link":"https://blog.shunzi.tech/post/fast20-some/","stats":{"text":"115 min read","time":6884000,"words":31357,"minutes":115},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li><a href=\"#fast20\">FAST20</a>\n<ul>\n<li><a href=\"#cloud-storage\">Cloud Storage</a>\n<ul>\n<li><a href=\"#mapx-controlled-data-migration-in-the-expansion-of-decentralized-object-based-storage-systems\">MAPX: Controlled Data Migration in the Expansion of Decentralized Object-Based Storage Systems</a>\n<ul>\n<li><a href=\"#%E7%AE%80%E8%A6%81%E4%BB%8B%E7%BB%8D\">简要介绍</a></li>\n<li><a href=\"#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88\">解决方案</a></li>\n</ul>\n</li>\n<li><a href=\"#lock-free-collaboration-support-for-cloud-storage-services-with-operation-inference-and-transformation\">Lock-Free Collaboration Support for Cloud Storage Services with Operation Inference and Transformation</a></li>\n<li><a href=\"#polardb-meets-computational-storage-efficiently-support-analytical-workloads-in-cloud-native-relational-database\">POLARDB Meets Computational Storage: Efficiently Support Analytical Workloads in Cloud-Native Relational Database</a>\n<ul>\n<li><a href=\"#%E7%AE%80%E8%A6%81%E4%BB%8B%E7%BB%8D-2\">简要介绍</a></li>\n<li><a href=\"#%E4%B8%AA%E4%BA%BA%E8%A7%81%E8%A7%A3\">个人见解</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#file-systems\">File Systems</a>\n<ul>\n<li><a href=\"#read-as-needed-building-wiser-a-flash-optimized-search-engine\">Read as Needed: Building WiSER, a Flash-Optimized Search Engine</a>\n<ul>\n<li><a href=\"#%E7%AE%80%E8%A6%81%E4%BB%8B%E7%BB%8D-3\">简要介绍</a>\n<ul>\n<li><a href=\"#%E8%83%8C%E6%99%AF\">背景</a></li>\n<li><a href=\"#design\">Design</a></li>\n</ul>\n</li>\n<li><a href=\"#%E4%B8%AA%E4%BA%BA%E8%A7%81%E8%A7%A3-2\">个人见解</a></li>\n</ul>\n</li>\n<li><a href=\"#how-to-copy-files\">How to Copy Files</a>\n<ul>\n<li><a href=\"#%E7%AE%80%E8%A6%81%E4%BB%8B%E7%BB%8D-4\">简要介绍</a>\n<ul>\n<li><a href=\"#%E8%83%8C%E6%99%AF-2\">背景</a></li>\n<li><a href=\"#design-2\">Design</a></li>\n</ul>\n</li>\n<li><a href=\"#%E4%B8%AA%E4%BA%BA%E8%A7%81%E8%A7%A3-3\">个人见解</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#ssd-and-reliability\">SSD and Reliability</a>\n<ul>\n<li><a href=\"#a-study-of-ssd-reliability-in-large-scale-enterprise-storage-deployments\">A Study of SSD Reliability in Large Scale Enterprise Storage Deployments</a>\n<ul>\n<li><a href=\"#%E7%AE%80%E8%A6%81%E4%BB%8B%E7%BB%8D-5\">简要介绍</a>\n<ul>\n<li><a href=\"#%E8%83%8C%E6%99%AF-3\">背景</a></li>\n<li><a href=\"#%E6%95%B0%E6%8D%AE%E7%BB%9F%E8%AE%A1%E5%88%86%E6%9E%90\">数据统计分析</a></li>\n<li><a href=\"#%E5%8E%9F%E5%9B%A0%E5%88%86%E6%9E%90\">原因分析</a></li>\n</ul>\n</li>\n<li><a href=\"#%E4%B8%AA%E4%BA%BA%E8%A7%81%E8%A7%A3-4\">个人见解</a></li>\n</ul>\n</li>\n<li><a href=\"#making-disk-failure-predictions-smarter\">Making Disk Failure Predictions SMARTer!</a></li>\n</ul>\n</li>\n<li><a href=\"#performance\">Performance</a>\n<ul>\n<li><a href=\"#an-empirical-guide-to-the-behavior-and-use-of-scalable-persistent-memory\">An Empirical Guide to the Behavior and Use of Scalable Persistent Memory</a></li>\n</ul>\n</li>\n<li><a href=\"#key-value-storage\">Key Value Storage</a>\n<ul>\n<li><a href=\"#characterizing-modeling-and-benchmarking-rocksdb-key-value-workloads-at-facebook\">Characterizing, Modeling, and Benchmarking RocksDB Key-Value Workloads at Facebook</a>\n<ul>\n<li><a href=\"#%E7%AE%80%E8%A6%81%E4%BB%8B%E7%BB%8D-6\">简要介绍</a>\n<ul>\n<li><a href=\"#introduction-background\">Introduction &amp; Background</a></li>\n<li><a href=\"#methodology-and-tool-set\">Methodology and Tool Set</a></li>\n<li><a href=\"#general-statistics-of-workloads\">General Statistics of Workloads</a></li>\n<li><a href=\"#modeling-and-benchmarking\">Modeling and Benchmarking</a></li>\n</ul>\n</li>\n<li><a href=\"#%E4%B8%AA%E4%BA%BA%E8%A7%81%E8%A7%A3-5\">个人见解</a></li>\n</ul>\n</li>\n<li><a href=\"#fpga-accelerated-compactions-for-lsm-based-key-value-store\">FPGA-Accelerated Compactions for LSM-based Key-Value Store</a>\n<ul>\n<li><a href=\"#%E7%AE%80%E8%A6%81%E4%BB%8B%E7%BB%8D-7\">简要介绍</a>\n<ul>\n<li><a href=\"#introduction-background-2\">Introduction &amp; Background</a></li>\n<li><a href=\"#design-and-implementation\">Design and Implementation</a></li>\n<li><a href=\"#evaluation\">Evaluation</a></li>\n<li><a href=\"#related-work\">Related Work</a></li>\n</ul>\n</li>\n<li><a href=\"#%E4%B8%AA%E4%BA%BA%E8%A7%81%E8%A7%A3-6\">个人见解</a></li>\n</ul>\n</li>\n<li><a href=\"#hotring-a-hotspot-aware-in-memory-key-value-store\">HotRing: A Hotspot-Aware In-Memory Key-Value Store</a>\n<ul>\n<li><a href=\"#%E7%AE%80%E8%A6%81%E4%BB%8B%E7%BB%8D-8\">简要介绍</a>\n<ul>\n<li><a href=\"#introduction-background-3\">Introduction &amp; Background</a></li>\n<li><a href=\"#design-3\">Design</a></li>\n</ul>\n</li>\n<li><a href=\"#%E4%B8%AA%E4%BA%BA%E8%A7%81%E8%A7%A3-7\">个人见解</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#caching\">Caching</a>\n<ul>\n<li><a href=\"#bcw-buffer-controlled-writes-to-hdds-for-ssd-hdd-hybrid-storage-server\">BCW: Buffer-Controlled Writes to HDDs for SSD-HDD Hybrid Storage Server</a>\n<ul>\n<li><a href=\"#design-4\">Design</a>\n<ul>\n<li><a href=\"#the-hdd-buffered-write-model\">The HDD Buffered-Write Model</a></li>\n<li><a href=\"#write-state-predictor\">Write-state Predictor</a></li>\n<li><a href=\"#buffer-controlled-writes\">Buffer-Controlled Writes</a></li>\n<li><a href=\"#mixed-io-scheduler\">Mixed IO scheduler</a></li>\n</ul>\n</li>\n<li><a href=\"#%E4%B8%AA%E4%BA%BA%E8%A7%81%E8%A7%A3-8\">个人见解</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#consistency-and-reliability\">Consistency and Reliability</a>\n<ul>\n<li><a href=\"#craft-an-erasure-coding-supported-version-of-raft-for-reducing-storage-cost-and-network-cost\">CRaft: An Erasure-coding-supported Version of Raft for Reducing Storage Cost and Network Cost</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-10-12 09:53:00","dateFormat":"2020-10-12"},{"fileName":"NSDI20-FileMR","abstract":"<blockquote>\n<ul>\n<li>NSDI 2020 的文章 FileMR: Rethinking RDMA Networking for Scalable Persistent Memory</li>\n</ul>\n</blockquote>\n","description":" NSDI 2020 的文章 FileMR: Rethinking RDMA Networking for Scalable Persistent Memory 这篇论文主要结合了 RDMA 和 NVM，针对各自的特性进行了整合...","title":"FileMR: Rethinking RDMA Networking for Scalable Persistent Memory","tags":[{"name":"Paper","slug":"5uQUdLlSC","used":true,"link":"https://blog.shunzi.tech/tag/5uQUdLlSC/"},{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20201005152720.png","link":"https://blog.shunzi.tech/post/NSDI20-FileMR/","stats":{"text":"34 min read","time":1996000,"words":9320,"minutes":34},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#abstract\">Abstract</a></li>\n<li><a href=\"#introduction\">Introduction</a>\n<ul>\n<li><a href=\"#rdma-networking\">RDMA Networking</a><br>\n*\n<ul>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\">参考链接</a></li>\n</ul>\n</li>\n<li><a href=\"#nvm\">NVM</a></li>\n<li><a href=\"#managing-rdma-and-nvmm\">Managing RDMA and NVMM</a>\n<ul>\n<li><a href=\"#naming\">Naming</a></li>\n<li><a href=\"#permission\">Permission</a></li>\n<li><a href=\"#allocation\">Allocation</a></li>\n<li><a href=\"#address-translation\">Address Translation</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#design\">Design</a>\n<ul>\n<li><a href=\"#assumptions-and-definitions\">Assumptions and Definitions</a></li>\n<li><a href=\"#filemr\">FileMR</a></li>\n<li><a href=\"#range-based-address-translation\">Range-based Address Translation</a></li>\n<li><a href=\"#design-overview\">Design Overview</a></li>\n</ul>\n</li>\n<li><a href=\"#implementation\">Implementation</a>\n<ul>\n<li><a href=\"#remote-file-access-in-nova\">Remote File Access in NOVA</a></li>\n<li><a href=\"#remote-nvmm-log-with-libpmemlog\">Remote NVMM Log with libpmemlog</a></li>\n</ul>\n</li>\n<li><a href=\"#evaluation\">Evaluation</a>\n<ul>\n<li><a href=\"#registration-overhead\">Registration Overhead</a>\n<ul>\n<li><a href=\"#allocated-regions\">Allocated Regions</a></li>\n<li><a href=\"#data-fragmentation\">Data Fragmentation</a></li>\n</ul>\n</li>\n<li><a href=\"#translation-cache-effectiveness\">Translation Cache Effectiveness</a></li>\n<li><a href=\"#accessing-remote-files\">Accessing Remote Files</a></li>\n<li><a href=\"#accessing-remote-nvmm-logs\">Accessing Remote NVMM logs</a></li>\n<li><a href=\"#discussion\">Discussion</a></li>\n<li><a href=\"#related-work\">Related Work</a></li>\n<li><a href=\"#conclusion\">Conclusion</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-10-05 16:37:41","dateFormat":"2020-10-05"},{"fileName":"rados-io-path","abstract":"<blockquote>\n<ul>\n<li>本篇主要总结 RADOS 底层的读写流程，并结合源码进行分析</li>\n<li>考虑基于现有的强一致性模型的读写流程是否有可以优化的点，提升 Ceph 的 IO 性能</li>\n<li></li>\n</ul>\n</blockquote>\n","description":" 本篇主要总结 RADOS 底层的读写流程，并结合源码进行分析 考虑基于现有的强一致性模型的读写流程是否有可以优化的点，提升 Ceph 的 IO 性能 OSD 读写流程 大致分为三个阶段： 接受请求：主要是网络模块相关 O...","title":"RADOS 读写流程","tags":[{"name":"Ceph","slug":"i2b42Y2j6","used":true,"link":"https://blog.shunzi.tech/tag/i2b42Y2j6/"},{"name":"分布式","slug":"geK0jEW-T","used":true,"link":"https://blog.shunzi.tech/tag/geK0jEW-T/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200924171959.png","link":"https://blog.shunzi.tech/post/rados-io-path/","stats":{"text":"58 min read","time":3444000,"words":11092,"minutes":58},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#osd-%E8%AF%BB%E5%86%99%E6%B5%81%E7%A8%8B\">OSD 读写流程</a></li>\n<li><a href=\"#pg\">PG</a>\n<ul>\n<li><a href=\"#%E5%B8%B8%E8%A7%81%E7%9A%84-pg-%E7%BA%A7%E5%88%AB%E7%9A%84%E6%93%8D%E4%BD%9C\">常见的 PG 级别的操作</a>\n<ul>\n<li><a href=\"#peering\">Peering</a>\n<ul>\n<li><a href=\"#%E6%B6%89%E5%8F%8A%E7%9A%84%E5%85%B6%E4%BB%96%E6%A6%82%E5%BF%B5\">涉及的其他概念</a></li>\n<li><a href=\"#%E8%A7%A6%E5%8F%91%E6%97%B6%E6%9C%BA\">触发时机</a></li>\n</ul>\n</li>\n<li><a href=\"#recovery\">Recovery</a>\n<ul>\n<li><a href=\"#%E8%BF%87%E7%A8%8B\">过程</a></li>\n<li><a href=\"#%E5%9C%BA%E6%99%AF\">场景</a></li>\n</ul>\n</li>\n<li><a href=\"#pullpush\">Pull/Push</a></li>\n<li><a href=\"#backfill\">Backfill</a></li>\n<li><a href=\"#scrub\">Scrub</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#primarylogpgdo_request\">PrimaryLogPG::do_request</a></li>\n<li><a href=\"#primarylogpgdo_op\">PrimaryLogPG::do_op</a></li>\n<li><a href=\"#execute_ctx\">execute_ctx</a></li>\n<li><a href=\"#issue_repop\">issue_repop</a>\n<ul>\n<li><a href=\"#submit_transaction\">submit_transaction</a></li>\n<li><a href=\"#issue_op\">issue_op</a></li>\n<li><a href=\"#do_repop\">do_repop</a></li>\n<li><a href=\"#queue_transactions\">queue_transactions</a></li>\n<li><a href=\"#repop_commit\">repop_commit</a></li>\n<li><a href=\"#do_repop_reply\">do_repop_reply</a></li>\n<li><a href=\"#repop_all_committed\">repop_all_committed</a></li>\n<li><a href=\"#eval_repop\">eval_repop</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-09-22 15:33:52","dateFormat":"2020-09-22"},{"fileName":"ASPLOS20-FlatStore","abstract":"<blockquote>\n<ul>\n<li>该篇文章来自于 ASPLOS20 - FlatStore: An Efficient Log-Structured Key-Value Storage Engine for Persistent Memory</li>\n</ul>\n</blockquote>\n","description":" 该篇文章来自于 ASPLOS20 - FlatStore: An Efficient Log-Structured Key-Value Storage Engine for Persistent Memory 要解决的主要问题...","title":"FlatStore: An Efficient Log-Structured Key-Value Storage Engine for Persistent Memory","tags":[{"name":"Paper","slug":"5uQUdLlSC","used":true,"link":"https://blog.shunzi.tech/tag/5uQUdLlSC/"},{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"LSM","slug":"_jfuTNqah","used":true,"link":"https://blog.shunzi.tech/tag/_jfuTNqah/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200916164129.png","link":"https://blog.shunzi.tech/post/ASPLOS20-FlatStore/","stats":{"text":"24 min read","time":1429000,"words":6532,"minutes":24},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#abstract\">Abstract</a></li>\n<li><a href=\"#introduction\">Introduction</a></li>\n<li><a href=\"#background-and-motivation\">Background And Motivation</a></li>\n<li><a href=\"#design\">Design</a>\n<ul>\n<li><a href=\"#overview\">Overview</a></li>\n<li><a href=\"#compacted-oplog\">Compacted OpLog</a></li>\n<li><a href=\"#lazy-persist-allocator\">Lazy-persist Allocator</a></li>\n<li><a href=\"#horizontal-batching\">Horizontal Batching</a></li>\n<li><a href=\"#log-cleaning\">Log Cleaning</a></li>\n<li><a href=\"#recovery\">Recovery</a></li>\n</ul>\n</li>\n<li><a href=\"#implementation\">Implementation</a>\n<ul>\n<li><a href=\"#flatstore-h-flatstore-with-hash-table\">FlatStore-H: FlatStore with Hash Table</a></li>\n<li><a href=\"#flatstore-m-flatstore-with-masstree\">FlatStore-M: FlatStore with Masstree</a></li>\n<li><a href=\"#rdma-based-flatrpc\">RDMA-based FlatRPC</a></li>\n</ul>\n</li>\n<li><a href=\"#evaluation\">Evaluation</a>\n<ul>\n<li><a href=\"#env\">Env</a></li>\n<li><a href=\"#compare\">Compare</a></li>\n<li><a href=\"#results\">Results</a>\n<ul>\n<li><a href=\"#ycsb\">YCSB</a></li>\n<li><a href=\"#facebook-etc-pool-production-workload\">Facebook ETC Pool - Production Workload</a></li>\n<li><a href=\"#multicore-scalability\">Multicore Scalability</a></li>\n<li><a href=\"#internal-function-performance-evaluations\">Internal Function Performance Evaluations</a></li>\n</ul>\n</li>\n<li><a href=\"#related-work\">Related Work</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-09-15 16:37:41","dateFormat":"2020-09-15"},{"fileName":"basic-of-virtualization-five","abstract":"<blockquote>\n<ul>\n<li>威斯康辛州大学操作系统书籍《Operating Systems: Three Easy Pieces》读书笔记系列之 Virtualization（虚拟化）。本篇为虚拟化技术的基础篇系列第三篇（Memory Virtualization），内存虚拟化。</li>\n<li>内存虚拟化又将分为两篇，本篇为第二篇内存虚拟化之分页</li>\n</ul>\n</blockquote>\n","description":" 威斯康辛州大学操作系统书籍《Operating Systems: Three Easy Pieces》读书笔记系列之 Virtualization（虚拟化）。本篇为虚拟化技术的基础篇系列第三篇（Memory Virtualization...","title":"Series Five of Basic of Virtualization - Memory Virtualization - Paging","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"读书笔记","slug":"la-n8a0mo","used":true,"link":"https://blog.shunzi.tech/tag/la-n8a0mo/"},{"name":"OS","slug":"os","used":true,"link":"https://blog.shunzi.tech/tag/os/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200717213648.png","link":"https://blog.shunzi.tech/post/basic-of-virtualization-five/","stats":{"text":"14 min read","time":808000,"words":3689,"minutes":14},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#chapter-index\">Chapter Index</a></li>\n<li><a href=\"#paging-introduction\">Paging: Introduction</a>\n<ul>\n<li><a href=\"#a-simple-example-and-overview\">A Simple Example And Overview</a></li>\n<li><a href=\"#where-are-page-tables-stored\">Where Are Page Tables Stored?</a></li>\n<li><a href=\"#whats-actually-in-the-page-table\">What’s Actually In The Page Table?</a></li>\n<li><a href=\"#paging-also-too-slow\">Paging: Also Too Slow</a></li>\n<li><a href=\"#a-memory-trace\">A Memory Trace</a></li>\n<li><a href=\"#summary\">Summary</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-09-13 15:40:00","dateFormat":"2020-09-13"},{"fileName":"Optane-Memory-UPS","abstract":"<blockquote>\n<ul>\n<li>项目新技术预研。Intel Optane Persistent Memory 和 备电（UPS）内存</li>\n<li>主要是资料整理，并考虑应用此类硬件技术到 Ceph.</li>\n</ul>\n</blockquote>\n","description":" 项目新技术预研。Intel Optane Persistent Memory 和 备电（UPS）内存 主要是资料整理，并考虑应用此类硬件技术到 Ceph. Optane Persistent Memory Prepare In...","title":"Optane Persisten Memory And UPS Memory","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200910163421.png","link":"https://blog.shunzi.tech/post/Optane-Memory-UPS/","stats":{"text":"10 min read","time":550000,"words":2505,"minutes":10},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#optane-persistent-memory\">Optane Persistent Memory</a>\n<ul>\n<li><a href=\"#prepare\">Prepare</a>\n<ul>\n<li><a href=\"#%E4%B8%8E-dram-%E7%9A%84%E5%8C%BA%E5%88%AB\">与 DRAM 的区别</a></li>\n<li><a href=\"#%E4%B8%8E-optane-ssd-%E7%9A%84%E5%8C%BA%E5%88%AB\">与 Optane SSD 的区别</a></li>\n<li><a href=\"#%E4%B8%8E-nvdimm-%E7%9A%84%E5%8C%BA%E5%88%AB\">与 NVDIMM 的区别</a></li>\n<li><a href=\"#optane-pm-%E4%BC%98%E5%8A%BF\">Optane PM 优势</a></li>\n</ul>\n</li>\n<li><a href=\"#persistent-memory-as-ceph-cache-in-openstack\">Persistent memory as Ceph cache in Openstack</a>\n<ul>\n<li><a href=\"#ceph-librbd\">Ceph librbd</a></li>\n<li><a href=\"#writeback-cache-in-ceph\">Writeback cache in Ceph</a></li>\n<li><a href=\"#replicated-write-back-cache-rwl\">Replicated write back cache (RWL)</a>\n<ul>\n<li><a href=\"#%E6%B5%8B%E8%AF%95\">测试</a></li>\n</ul>\n</li>\n<li><a href=\"#pmdk\">PMDK</a></li>\n</ul>\n</li>\n<li><a href=\"#crimson\">Crimson</a>\n<ul>\n<li><a href=\"#seastar\">Seastar</a></li>\n<li><a href=\"#seastar-in-crimson\">Seastar in Crimson</a>\n<ul>\n<li><a href=\"#seastore\">Seastore</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE\">参考文献</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-09-10 20:32:20","dateFormat":"2020-09-10"},{"fileName":"OC-SSD-AND-ZNS","abstract":"<blockquote>\n<ul>\n<li>项目新技术预研。OpenChannel SSD 和 ZNS SSD</li>\n<li>主要是资料整理，并考虑应用此类硬件技术到 Ceph.</li>\n</ul>\n</blockquote>\n","description":" 项目新技术预研。OpenChannel SSD 和 ZNS SSD 主要是资料整理，并考虑应用此类硬件技术到 Ceph. OC SSD &amp; ZNS Prepare NVM Express™ Specification: ...","title":"OC SSD & ZNS","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200908093333.png","link":"https://blog.shunzi.tech/post/OC-SSD-AND-ZNS/","stats":{"text":"13 min read","time":755000,"words":3251,"minutes":13},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li><a href=\"#oc-ssd-zns\">OC SSD &amp; ZNS</a><br>\n*\n<ul>\n<li><a href=\"#prepare\">Prepare</a>\n<ul>\n<li><a href=\"#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE\">参考文献</a></li>\n</ul>\n</li>\n<li><a href=\"#open-channel-ssd\">Open-Channel SSD</a>\n<ul>\n<li><a href=\"#ecosystem\">Ecosystem</a>\n<ul>\n<li><a href=\"#lightnvm-pblk\">LightNVM &amp; PBLK</a>\n<ul>\n<li><a href=\"#ppa-addressing\">PPA Addressing</a></li>\n</ul>\n</li>\n<li><a href=\"#nvme-device-drivers\">NVMe Device drivers</a></li>\n<li><a href=\"#pblk\">PBLK</a>\n<ul>\n<li><a href=\"#write-buffering\">Write Buffering</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#solution\">Solution</a>\n<ul>\n<li><a href=\"#qblk\">QBLK</a></li>\n<li><a href=\"#ocstore\">OCStore</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#zoned-namespace\">Zoned Namespace</a>\n<ul>\n<li><a href=\"#concepts\">Concepts</a></li>\n<li><a href=\"#states-and-operations\">States And Operations</a></li>\n<li><a href=\"#zns-ssd\">ZNS SSD</a>\n<ul>\n<li><a href=\"#%E9%99%90%E5%88%B6\">限制</a></li>\n</ul>\n</li>\n<li><a href=\"#ecosystem-2\">Ecosystem</a>\n<ul>\n<li><a href=\"#spdk\">SPDK</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\">参考链接</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-09-09 20:32:20","dateFormat":"2020-09-09"},{"fileName":"basic-of-virtualization-four","abstract":"<blockquote>\n<ul>\n<li>威斯康辛州大学操作系统书籍《Operating Systems: Three Easy Pieces》读书笔记系列之 Virtualization（虚拟化）。本篇为虚拟化技术的基础篇系列第三篇（Memory Virtualization），内存虚拟化。</li>\n<li>内存虚拟化又将分为两篇，本篇为第一篇内存虚拟化之基础和分段</li>\n</ul>\n</blockquote>\n","description":" 威斯康辛州大学操作系统书籍《Operating Systems: Three Easy Pieces》读书笔记系列之 Virtualization（虚拟化）。本篇为虚拟化技术的基础篇系列第三篇（Memory Virtualization...","title":"Series Four of Basic of Virtualization - Memory Virtualization - Basic And Segmentation","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"读书笔记","slug":"la-n8a0mo","used":true,"link":"https://blog.shunzi.tech/tag/la-n8a0mo/"},{"name":"OS","slug":"os","used":true,"link":"https://blog.shunzi.tech/tag/os/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200717213648.png","link":"https://blog.shunzi.tech/post/basic-of-virtualization-four/","stats":{"text":"52 min read","time":3075000,"words":14598,"minutes":52},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#chapter-index\">Chapter Index</a></li>\n<li><a href=\"#dialogue\">Dialogue</a></li>\n<li><a href=\"#the-abstraction-address-spaces\">The Abstraction: Address Spaces</a>\n<ul>\n<li><a href=\"#early-systems\">Early Systems</a></li>\n<li><a href=\"#multiprogramming-and-time-sharing\">Multiprogramming and Time Sharing</a></li>\n<li><a href=\"#the-address-space\">The Address Space</a></li>\n<li><a href=\"#goals\">Goals</a></li>\n<li><a href=\"#summary\">Summary</a></li>\n</ul>\n</li>\n<li><a href=\"#interlude-memory-api\">Interlude: Memory API</a>\n<ul>\n<li><a href=\"#types-of-memory\">Types of Memory</a></li>\n<li><a href=\"#the-malloc-and-free-call\">The <code>malloc()</code> AND <code>free()</code> Call</a></li>\n<li><a href=\"#common-errors\">Common Errors</a></li>\n<li><a href=\"#underlying-os-support\">Underlying OS Support</a></li>\n</ul>\n</li>\n<li><a href=\"#mechanism-address-translation\">Mechanism: Address Translation</a>\n<ul>\n<li><a href=\"#an-example\">An Example</a></li>\n<li><a href=\"#dynamic-hardware-based-relocation\">Dynamic (Hardware-based) Relocation</a></li>\n<li><a href=\"#hardware-support-a-summary\">Hardware Support: A Summary</a></li>\n<li><a href=\"#operating-system-issues\">Operating System Issues</a></li>\n<li><a href=\"#summary-2\">Summary</a></li>\n</ul>\n</li>\n<li><a href=\"#segmentation\">Segmentation</a>\n<ul>\n<li><a href=\"#segmentation-generalized-basebounds\">Segmentation: Generalized Base/Bounds</a></li>\n<li><a href=\"#which-segment-are-we-referring-to\">Which Segment Are We Referring To?</a>\n<ul>\n<li><a href=\"#explicit\">Explicit</a></li>\n<li><a href=\"#implict\">Implict</a></li>\n</ul>\n</li>\n<li><a href=\"#what-about-the-stack\">What About The Stack?</a></li>\n<li><a href=\"#support-for-sharing\">Support for Sharing</a></li>\n<li><a href=\"#fine-grained-vs-coarse-grained-segmentation\">Fine-grained vs. Coarse-grained Segmentation</a></li>\n<li><a href=\"#os-support\">OS Support</a></li>\n<li><a href=\"#summary-3\">Summary</a></li>\n</ul>\n</li>\n<li><a href=\"#free-space-management\">Free-Space Management</a>\n<ul>\n<li><a href=\"#assumptions\">Assumptions</a></li>\n<li><a href=\"#low-level-mechanisms\">Low-level Mechanisms</a>\n<ul>\n<li><a href=\"#splitting-and-coalescing\">Splitting and Coalescing</a></li>\n<li><a href=\"#tracking-the-size-of-allocated-regions\">Tracking The Size Of Allocated Regions</a></li>\n<li><a href=\"#embedding-a-free-list\">Embedding A Free List</a></li>\n<li><a href=\"#growing-the-heap\">Growing The Heap</a></li>\n</ul>\n</li>\n<li><a href=\"#basic-strategies\">Basic Strategies</a>\n<ul>\n<li><a href=\"#best-fit\">Best Fit</a></li>\n<li><a href=\"#worst-fit\">Worst Fit</a></li>\n<li><a href=\"#first-fit\">First Fit</a></li>\n<li><a href=\"#next-fit\">Next Fit</a></li>\n<li><a href=\"#examples\">Examples</a></li>\n</ul>\n</li>\n<li><a href=\"#other-approaches\">Other Approaches</a>\n<ul>\n<li><a href=\"#segregated-lists\">Segregated Lists</a></li>\n<li><a href=\"#buddy-allocation\">Buddy Allocation</a></li>\n<li><a href=\"#other-ideas\">Other Ideas</a></li>\n</ul>\n</li>\n<li><a href=\"#summary-4\">Summary</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-08-23 11:40:00","dateFormat":"2020-08-23"},{"fileName":"basic-of-virtualization-three","abstract":"<blockquote>\n<ul>\n<li>CPU 虚拟化被分为两篇，此篇是第二篇，Policy</li>\n</ul>\n</blockquote>\n","description":" CPU 虚拟化被分为两篇，此篇是第二篇，Policy 今天阅读到项目代码时候，涉及到了 Python 协程的概念，由于才疏学浅一时半会儿未能参透协程的实际意义。查阅了很多资料，都是和线程、进程对照着一起阐述，理解起来实在有难度...","title":"Series Three of Basic of Virtulization - Mechanism and Policy Part.2","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"读书笔记","slug":"la-n8a0mo","used":true,"link":"https://blog.shunzi.tech/tag/la-n8a0mo/"},{"name":"OS","slug":"os","used":true,"link":"https://blog.shunzi.tech/tag/os/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200717213648.png","link":"https://blog.shunzi.tech/post/basic-of-virtualization-three/","stats":{"text":"44 min read","time":2603000,"words":11989,"minutes":44},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#chapter-index\">Chapter Index</a></li>\n<li><a href=\"#scheduling-introduction\">Scheduling: Introduction</a>\n<ul>\n<li><a href=\"#pre-scheduling\">Pre-Scheduling</a>\n<ul>\n<li><a href=\"#workload-assumptions\">Workload Assumptions</a></li>\n<li><a href=\"#scheduling-metrics\">Scheduling Metrics</a></li>\n</ul>\n</li>\n<li><a href=\"#first-in-first-out-fifo\">First In, First Out (FIFO)</a></li>\n<li><a href=\"#shortest-job-first-sjf\">Shortest Job First (SJF)</a></li>\n<li><a href=\"#shortest-time-to-completion-first-stcf\">Shortest Time-to-Completion First (STCF)</a></li>\n<li><a href=\"#a-new-metric-response-time\">A New Metric: Response Time</a></li>\n<li><a href=\"#round-robin\">Round Robin</a></li>\n<li><a href=\"#incorporating-io\">Incorporating I/O</a></li>\n<li><a href=\"#no-more-oracle\">No More Oracle</a></li>\n</ul>\n</li>\n<li><a href=\"#scheduling-the-multi-level-feedback-queue\">Scheduling: The Multi-Level Feedback Queue</a>\n<ul>\n<li><a href=\"#mlfq-basic-rules\">MLFQ: Basic Rules</a></li>\n<li><a href=\"#attempt-1-how-to-change-priority\">Attempt #1: How To Change Priority</a>\n<ul>\n<li><a href=\"#example-1-a-single-long-running-job\">Example 1: A Single Long-Running Job</a></li>\n<li><a href=\"#example-2-along-came-a-short-job\">Example 2: Along Came A Short Job</a></li>\n<li><a href=\"#example-3-what-about-io\">Example 3: What About I/O?</a></li>\n<li><a href=\"#problems-with-our-current-mlfq\">Problems With Our Current MLFQ</a></li>\n</ul>\n</li>\n<li><a href=\"#attempt-2-the-priority-boost\">Attempt #2: The Priority Boost</a></li>\n<li><a href=\"#attempt-3-better-accounting\">Attempt #3: Better Accounting</a></li>\n<li><a href=\"#tuning-mlfq-and-other-issues\">Tuning MLFQ And Other Issues</a></li>\n<li><a href=\"#summary\">Summary</a></li>\n</ul>\n</li>\n<li><a href=\"#scheduling-proportional-share\">Scheduling: Proportional Share</a>\n<ul>\n<li><a href=\"#basic-concept-tickets-represent-your-share\">Basic Concept: Tickets Represent Your Share</a></li>\n<li><a href=\"#ticket-mechanisms\">Ticket Mechanisms</a></li>\n<li><a href=\"#implementation\">Implementation</a></li>\n<li><a href=\"#an-example\">An Example</a></li>\n<li><a href=\"#how-to-assign-tickets\">How To Assign Tickets?</a></li>\n<li><a href=\"#why-not-deterministic\">Why Not Deterministic?</a></li>\n<li><a href=\"#the-linux-completely-fair-scheduler-cfs\">The Linux Completely Fair Scheduler (CFS)</a>\n<ul>\n<li><a href=\"#basic-operation\">Basic Operation</a></li>\n<li><a href=\"#weighting-niceness\">Weighting (Niceness)</a></li>\n<li><a href=\"#using-red-black-trees\">Using Red-Black Trees</a></li>\n<li><a href=\"#dealing-with-io-and-sleeping-processes\">Dealing With I/O And Sleeping Processes</a></li>\n</ul>\n</li>\n<li><a href=\"#summary-2\">Summary</a></li>\n</ul>\n</li>\n<li><a href=\"#multiprocessor-scheduling-advanced\">Multiprocessor Scheduling (Advanced)</a>\n<ul>\n<li><a href=\"#background-multiprocessor-architecture\">Background: Multiprocessor Architecture</a></li>\n<li><a href=\"#dont-forget-synchronization\">Don’t Forget Synchronization</a></li>\n<li><a href=\"#one-final-issue-cache-affinity\">One Final Issue: Cache Affinity</a></li>\n<li><a href=\"#single-queue-scheduling\">Single-Queue Scheduling</a></li>\n<li><a href=\"#multi-queue-scheduling\">Multi-Queue Scheduling</a></li>\n<li><a href=\"#linux-multiprocessor-schedulers\">Linux Multiprocessor Schedulers</a>\n<ul>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\">参考链接</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-08-20 11:40:00","dateFormat":"2020-08-20"},{"fileName":"basic-of-virtualization-two","abstract":"<blockquote>\n<ul>\n<li>CPU 虚拟化被分为两篇，此篇是第一篇，Mechanism</li>\n</ul>\n</blockquote>\n","description":" CPU 虚拟化被分为两篇，此篇是第一篇，Mechanism 今天阅读到项目代码时候，涉及到了 Python 协程的概念，由于才疏学浅一时半会儿未能参透协程的实际意义。查阅了很多资料，都是和线程、进程对照着一起阐述，理解起来实在...","title":"Series Two of Basic of Virtulization - Mechanism and Policy Part.1","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"读书笔记","slug":"la-n8a0mo","used":true,"link":"https://blog.shunzi.tech/tag/la-n8a0mo/"},{"name":"OS","slug":"os","used":true,"link":"https://blog.shunzi.tech/tag/os/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200717213648.png","link":"https://blog.shunzi.tech/post/basic-of-virtualization-two/","stats":{"text":"14 min read","time":783000,"words":3627,"minutes":14},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#chapter-index\">Chapter Index</a></li>\n<li><a href=\"#mechanism-limited-direct-execution\">Mechanism: Limited Direct Execution</a>\n<ul>\n<li><a href=\"#basic-technique-limited-direct-execution\">Basic Technique: Limited Direct Execution</a></li>\n<li><a href=\"#problem-1-restricted-operations\">Problem #1: Restricted Operations</a></li>\n<li><a href=\"#problem-2-switching-between-processes\">Problem #2: Switching Between Processes</a>\n<ul>\n<li><a href=\"#a-cooperative-approach-wait-for-system-calls\">A Cooperative Approach: Wait For System Calls</a></li>\n<li><a href=\"#a-non-cooperative-approach-the-os-takes-control\">A Non-Cooperative Approach: The OS Takes Control</a></li>\n<li><a href=\"#saving-and-restoring-context\">Saving and Restoring Context</a></li>\n</ul>\n</li>\n<li><a href=\"#worried-about-concurrency\">Worried About Concurrency?</a></li>\n<li><a href=\"#summary\">Summary</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-08-19 11:40:00","dateFormat":"2020-08-19"},{"fileName":"basic-of-virtualization-one","abstract":"<blockquote>\n<ul>\n<li>威斯康辛州大学操作系统书籍《Operating Systems: Three Easy Pieces》读书笔记系列之 Virtulization（虚拟化）。本篇为虚拟化技术的基础篇系列第一篇（Processes and API），进程和进程API。</li>\n</ul>\n</blockquote>\n","description":" 威斯康辛州大学操作系统书籍《Operating Systems: Three Easy Pieces》读书笔记系列之 Virtulization（虚拟化）。本篇为虚拟化技术的基础篇系列第一篇（Processes and API），进程和...","title":"Series One of Basic of Virtulization - Processes and API","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"读书笔记","slug":"la-n8a0mo","used":true,"link":"https://blog.shunzi.tech/tag/la-n8a0mo/"},{"name":"OS","slug":"os","used":true,"link":"https://blog.shunzi.tech/tag/os/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200717213648.png","link":"https://blog.shunzi.tech/post/basic-of-virtualization-one/","stats":{"text":"18 min read","time":1073000,"words":4417,"minutes":18},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#chapter-index\">Chapter Index</a></li>\n</ul>\n</li>\n<li><a href=\"#virtualization\">Virtualization</a>\n<ul>\n<li><a href=\"#dialogue\">Dialogue</a></li>\n<li><a href=\"#processes\">Processes</a>\n<ul>\n<li><a href=\"#%E6%8A%BD%E8%B1%A1%E8%BF%9B%E7%A8%8B\">抽象：进程</a></li>\n<li><a href=\"#%E8%BF%9B%E7%A8%8B-api-%E5%88%86%E7%B1%BB\">进程 API 分类</a>\n<ul>\n<li><a href=\"#%E8%BF%9B%E7%A8%8B%E5%88%9B%E5%BB%BA\">进程创建</a></li>\n<li><a href=\"#%E8%BF%9B%E7%A8%8B%E7%8A%B6%E6%80%81\">进程状态</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84\">数据结构</a></li>\n</ul>\n</li>\n<li><a href=\"#process-api\">Process API</a>\n<ul>\n<li><a href=\"#fork\">fork()</a></li>\n<li><a href=\"#wait\">wait()</a></li>\n<li><a href=\"#exec\">exec()</a></li>\n<li><a href=\"#%E4%B8%BA%E4%BB%80%E4%B9%88%E8%BF%99%E6%A0%B7%E8%AE%BE%E8%AE%A1\">为什么这样设计？</a></li>\n<li><a href=\"#%E5%85%B6%E4%BB%96\">其他</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-08-15 11:40:00","dateFormat":"2020-08-15"},{"fileName":"GearDB","abstract":"","description":" 该篇文章来自于 FAST2019 - GearDB: A GC-free Key-Value Store on HM-SMR Drives with Gear Compaction 该篇文章来自于 FAST2019 - Gea...","title":"GearDB: A GC-free Key-Value Store on HM-SMR Drives with Gear Compaction","tags":[{"name":"Paper","slug":"5uQUdLlSC","used":true,"link":"https://blog.shunzi.tech/tag/5uQUdLlSC/"},{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"LSM","slug":"_jfuTNqah","used":true,"link":"https://blog.shunzi.tech/tag/_jfuTNqah/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20201002161629.png","link":"https://blog.shunzi.tech/post/GearDB/","stats":{"text":"16 min read","time":917000,"words":4170,"minutes":16},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#abstract\">Abstract</a></li>\n<li><a href=\"#introduction-background\">Introduction &amp; Background</a>\n<ul>\n<li><a href=\"#smr\">SMR</a></li>\n<li><a href=\"#lsm-tree\">LSM-Tree</a></li>\n<li><a href=\"#motivation\">Motivation</a></li>\n</ul>\n</li>\n<li><a href=\"#design\">Design</a>\n<ul>\n<li><a href=\"#a-new-on-disk-data-layout\">A New On-disk Data Layout</a></li>\n<li><a href=\"#compaction-windows\">Compaction Windows</a></li>\n<li><a href=\"#gear-compaction\">Gear Compaction</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-08-13 16:37:41","dateFormat":"2020-08-13"},{"fileName":"PinK","abstract":"<blockquote>\n<ul>\n<li>该篇文章来自于 ATC2020 Best Paper PinK: High-speed In-storage Key-value Store with Bounded Tails</li>\n<li>论文其实是基于一种新的 KV 存储形式 KV-SSD 开展研究的，KV-SSD 近年来常被提及，未来可能作为一种新型存储器件在键值存储系统中使用。</li>\n<li>本文的工作主要实现了基于 LSM-Tree 的 KV-SSD，和基于哈希的 KV-SSD 进行了对比。</li>\n</ul>\n</blockquote>\n","description":" 该篇文章来自于 ATC2020 Best Paper PinK: High-speed In-storage Key-value Store with Bounded Tails 论文其实是基于一种新的 KV 存储形式 KV-SSD 开...","title":"PinK: High-speed In-storage Key-value Store with Bounded Tails","tags":[{"name":"Paper","slug":"5uQUdLlSC","used":true,"link":"https://blog.shunzi.tech/tag/5uQUdLlSC/"},{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"LSM","slug":"_jfuTNqah","used":true,"link":"https://blog.shunzi.tech/tag/_jfuTNqah/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200808150414.png","link":"https://blog.shunzi.tech/post/PinK/","stats":{"text":"22 min read","time":1296000,"words":5571,"minutes":22},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#abstract\">Abstract</a></li>\n<li><a href=\"#introduction-background\">Introduction &amp; Background</a>\n<ul>\n<li><a href=\"#kv-store\">KV Store</a>\n<ul>\n<li><a href=\"#%E7%8E%B0%E6%9C%89%E7%9A%84%E4%BC%98%E5%8C%96%E6%96%B9%E6%A1%88\">现有的优化方案</a></li>\n</ul>\n</li>\n<li><a href=\"#nand-flash-based-ssd\">NAND Flash-based SSD</a></li>\n<li><a href=\"#kv-ssd\">KV-SSD</a>\n<ul>\n<li><a href=\"#%E5%B7%A5%E4%B8%9A%E7%95%8C\">工业界</a></li>\n<li><a href=\"#%E5%AD%A6%E6%9C%AF%E7%95%8C\">学术界</a></li>\n<li><a href=\"#hash-based-kv-ssd\">HASH-Based KV-SSD</a></li>\n<li><a href=\"#%E7%8E%B0%E5%9C%A8%E7%9A%84-kv-ssd-%E5%AD%98%E5%9C%A8%E7%9A%84%E9%97%AE%E9%A2%98\">现在的 KV-SSD 存在的问题</a></li>\n<li><a href=\"#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88\">解决方案</a>\n<ul>\n<li><a href=\"#%E9%80%9A%E7%94%A8%E7%9A%84-lsm-tree-%E6%96%B9%E6%A1%88%E5%AD%98%E5%9C%A8%E7%9A%84%E9%97%AE%E9%A2%98\">通用的 LSM-tree 方案存在的问题</a></li>\n<li><a href=\"#%E6%9C%AC%E6%96%87%E7%9A%84%E6%96%B9%E6%A1%88\">本文的方案</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#design\">Design</a>\n<ul>\n<li><a href=\"#data-structure\">Data Structure</a></li>\n<li><a href=\"#improving-io-speed-with-level-pinning\">Improving I/O Speed with Level Pinning</a>\n<ul>\n<li><a href=\"#%E7%90%86%E8%A7%A3\">理解</a></li>\n</ul>\n</li>\n<li><a href=\"#optimizing-search-path\">Optimizing Search Path</a></li>\n<li><a href=\"#speeding-up-compaction\">Speeding up Compaction</a></li>\n<li><a href=\"#optimizing-garbage-collection\">Optimizing Garbage Collection</a>\n<ul>\n<li><a href=\"#gc-for-meta-segment\">GC for Meta Segment</a></li>\n<li><a href=\"#gc-for-data-segment\">GC for Data Segment</a></li>\n</ul>\n</li>\n<li><a href=\"#durability-and-scalability-issues\">Durability and Scalability Issues</a>\n<ul>\n<li><a href=\"#durability-with-limited-capacitor\">Durability with Limited Capacitor</a></li>\n<li><a href=\"#dram-scalability\">DRAM Scalability</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#evaluation\">Evaluation</a>\n<ul>\n<li><a href=\"#%E5%88%86%E6%9E%90\">分析</a></li>\n</ul>\n</li>\n<li><a href=\"#conclusion\">Conclusion</a></li>\n<li><a href=\"#references\">References</a></li>\n</ul>\n</li>\n</ul>\n","date":"2020-08-07 16:37:41","dateFormat":"2020-08-07"},{"fileName":"KVell","abstract":"<blockquote>\n<ul>\n<li>该篇文章来自于 SOSP2019 的论文 KVell: the Design and Implementation of a Fast Persistent Key-Value Store</li>\n</ul>\n</blockquote>\n","description":" 该篇文章来自于 SOSP2019 的论文 KVell: the Design and Implementation of a Fast Persistent Key-Value Store 论文提到了一个比较犀利的观点：KV ...","title":"KVell: the Design and Implementation of a Fast Persistent Key-Value Store","tags":[{"name":"Paper","slug":"5uQUdLlSC","used":true,"link":"https://blog.shunzi.tech/tag/5uQUdLlSC/"},{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"LSM","slug":"_jfuTNqah","used":true,"link":"https://blog.shunzi.tech/tag/_jfuTNqah/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200804165314.png","link":"https://blog.shunzi.tech/post/KVell/","stats":{"text":"41 min read","time":2411000,"words":10839,"minutes":41},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#abstract\">Abstract</a></li>\n<li><a href=\"#introduction\">Introduction</a></li>\n<li><a href=\"#evolution-of-ssd-performance\">Evolution of SSD Performance</a>\n<ul>\n<li><a href=\"#ssd-%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95\">SSD 性能测试</a></li>\n</ul>\n</li>\n<li><a href=\"#nvme-ssd-%E4%B8%8A%E5%BD%93%E5%89%8D-kvs-%E7%9A%84%E9%97%AE%E9%A2%98\">NVMe SSD 上当前 KVs 的问题</a>\n<ul>\n<li><a href=\"#cpu-is-the-bottleneck\">CPU is the bottleneck</a>\n<ul>\n<li><a href=\"#cpu-is-the-bottleneck-in-lsm-kvs\">CPU is the bottleneck in LSM KVs</a></li>\n<li><a href=\"#cpu-is-the-bottleneck-in-lsm-kvs-2\">CPU is the bottleneck in LSM KVs</a></li>\n<li><a href=\"#performance-fluctuations-in-lsm-and-b-tree-kvs\">Performance fluctuations in LSM and B tree KVs</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#kvell-design-principles\">KVell design principles</a>\n<ul>\n<li><a href=\"#share-nothing\">Share nothing</a></li>\n<li><a href=\"#do-not-sort-on-disk-but-keep-indexes-in-memory\">Do not sort on disk, but keep indexes in memory</a></li>\n<li><a href=\"#aim-for-fewer-syscalls-not-for-sequential-io\">Aim for fewer syscalls, not for sequential I/O</a></li>\n<li><a href=\"#no-commit-log\">No commit log</a></li>\n</ul>\n</li>\n<li><a href=\"#kvell-implementation\">KVell implementation</a>\n<ul>\n<li><a href=\"#client-operations-interface\">Client operations interface</a></li>\n<li><a href=\"#on-disk-data-structures\">On-disk data structures</a></li>\n<li><a href=\"#in-memory-data-structures\">In-memory data structures</a>\n<ul>\n<li><a href=\"#index\">Index</a></li>\n<li><a href=\"#page-cache\">Page Cache</a></li>\n<li><a href=\"#free-list\">Free list</a></li>\n</ul>\n</li>\n<li><a href=\"#efficiently-performing-io\">Efficiently performing I/O</a></li>\n<li><a href=\"#client-operation-implementation\">Client operation implementation</a>\n<ul>\n<li><a href=\"#getk\">Get(k)</a></li>\n<li><a href=\"#updatekv\">Update(k,v)</a></li>\n<li><a href=\"#scank1k2\">Scan(k1,k2)</a></li>\n</ul>\n</li>\n<li><a href=\"#failure-model-and-recovery\">Failure model and recovery</a></li>\n</ul>\n</li>\n<li><a href=\"#evaluation\">Evaluation</a>\n<ul>\n<li><a href=\"#goals\">Goals</a></li>\n<li><a href=\"#experimental-setting\">Experimental setting</a></li>\n<li><a href=\"#results-in-the-main-experimental-setting\">Results in the main experimental setting</a>\n<ul>\n<li><a href=\"#throughput\">Throughput</a></li>\n<li><a href=\"#throughput-over-time\">Throughput over time</a></li>\n<li><a href=\"#tail-latency\">Tail latency</a></li>\n<li><a href=\"#alternative-configurations-and-workloads\">Alternative configurations and workloads</a></li>\n</ul>\n</li>\n<li><a href=\"#trade-offs-and-limitations\">Trade-offs and Limitations</a>\n<ul>\n<li><a href=\"#average-latency\">Average latency</a></li>\n<li><a href=\"#impact-of-item-size\">Impact of item size</a></li>\n<li><a href=\"#memory-size-impact\">Memory size impact</a></li>\n<li><a href=\"#older-drives-config-ssd\">Older drives (Config-SSD)</a></li>\n<li><a href=\"#recovery-time\">Recovery time</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#related-work\">Related Work</a>\n<ul>\n<li><a href=\"#kvs-for-ssds\">KVs for SSDs</a></li>\n<li><a href=\"#kvs-for-byte-addressable-persistent-memory\">KVs for byte-addressable persistent memory</a></li>\n<li><a href=\"#kvs-for-in-memory-data-stores\">KVs for in-memory data stores</a></li>\n</ul>\n</li>\n<li><a href=\"#conclusion\">Conclusion</a></li>\n</ul>\n</li>\n</ul>\n","date":"2020-08-02 16:37:41","dateFormat":"2020-08-02"},{"fileName":"tiny-kv-tutorial","abstract":"<blockquote>\n<ul>\n<li><a href=\"https://university.pingcap.com/talent-plan/\">PingCAP Talent Plan</a></li>\n<li>记录一些学习路径中的关键知识点</li>\n</ul>\n</blockquote>\n","description":" PingCAP Talent Plan 记录一些学习路径中的关键知识点 Mini Key-Value Database badger Github Repo ...","title":"TinyKV 学习笔记","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"LSM","slug":"_jfuTNqah","used":true,"link":"https://blog.shunzi.tech/tag/_jfuTNqah/"}],"feature":"https://blog.shunzi.tech/post-images/the-log-structured-merge-tree-lsm-tree.png","link":"https://blog.shunzi.tech/post/tiny-kv-tutorial/","stats":{"text":"1 min read","time":6000,"words":25,"minutes":1},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#mini-key-value-database\">Mini Key-Value Database</a>\n<ul>\n<li><a href=\"#badger\">badger</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-07-30 09:53:00","dateFormat":"2020-07-30"},{"fileName":"MatrixKV","abstract":"<blockquote>\n<ul>\n<li>该篇文章来自于 ATC2020 上非易失主题下的论文 MatrixKV: Reducing Write Stalls and Write Amplification in LSM-tree Based KV Stores with Matrix Container in NVM</li>\n</ul>\n</blockquote>\n","description":" 该篇文章来自于 ATC2020 上非易失主题下的论文 MatrixKV: Reducing Write Stalls and Write Amplification in LSM-tree Based KV Stores with Ma...","title":"MatrixKV: Reducing Write Stalls and Write Amplification in LSM-tree Based KV Stores with Matrix Container in NVM","tags":[{"name":"Paper","slug":"5uQUdLlSC","used":true,"link":"https://blog.shunzi.tech/tag/5uQUdLlSC/"},{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"LSM","slug":"_jfuTNqah","used":true,"link":"https://blog.shunzi.tech/tag/_jfuTNqah/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200729103236.png","link":"https://blog.shunzi.tech/post/MatrixKV/","stats":{"text":"26 min read","time":1505000,"words":6680,"minutes":26},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#abstract\">Abstract</a></li>\n<li><a href=\"#introduction\">Introduction</a>\n<ul>\n<li><a href=\"#%E5%85%B3%E9%94%AE%E6%8A%80%E6%9C%AF\">关键技术</a></li>\n</ul>\n</li>\n<li><a href=\"#background-and-motivation\">Background and Motivation</a>\n<ul>\n<li><a href=\"#background\">Background</a></li>\n<li><a href=\"#challenges-and-motivations\">Challenges and Motivations</a>\n<ul>\n<li><a href=\"#write-stalls\">Write Stalls</a></li>\n<li><a href=\"#write-amplification\">Write Amplification</a></li>\n<li><a href=\"#novelsm\">NoveLSM</a></li>\n<li><a href=\"#summary\">Summary</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#matrixkv-design\">MatrixKV Design</a>\n<ul>\n<li><a href=\"#matrix-container\">Matrix Container</a>\n<ul>\n<li><a href=\"#receiver\">Receiver</a></li>\n</ul>\n</li>\n<li><a href=\"#column-compaction\">Column Compaction</a></li>\n<li><a href=\"#reducing-lsm-tree-depth\">Reducing LSM-tree Depth</a></li>\n<li><a href=\"#cross-row-hint-search\">Cross-row Hint Search</a></li>\n</ul>\n</li>\n<li><a href=\"#implementation\">Implementation</a></li>\n<li><a href=\"#evaluation\">Evaluation</a>\n<ul>\n<li><a href=\"#%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83\">测试环境</a></li>\n<li><a href=\"#%E5%AF%B9%E7%85%A7%E7%BB%84\">对照组</a></li>\n<li><a href=\"#%E5%85%B6%E4%BB%96%E9%85%8D%E7%BD%AE\">其他配置</a></li>\n<li><a href=\"#%E8%B4%9F%E8%BD%BD\">负载</a></li>\n<li><a href=\"#%E6%B5%8B%E8%AF%95%E7%BB%93%E6%9E%9C\">测试结果</a>\n<ul>\n<li><a href=\"#db_bench-%E5%86%99%E6%80%A7%E8%83%BD\">db_bench 写性能</a>\n<ul>\n<li><a href=\"#%E9%9A%8F%E6%9C%BA%E5%86%99\">随机写</a></li>\n<li><a href=\"#%E9%A1%BA%E5%BA%8F%E5%86%99\">顺序写</a></li>\n</ul>\n</li>\n<li><a href=\"#db_bench-%E8%AF%BB%E6%80%A7%E8%83%BD\">db_bench 读性能</a></li>\n<li><a href=\"#ycsb\">YCSB</a></li>\n<li><a href=\"#tail-latency\">Tail latency</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90\">性能分析</a>\n<ul>\n<li><a href=\"#%E5%86%99%E5%81%9C%E9%A1%BF\">写停顿</a></li>\n<li><a href=\"#%E5%86%99%E6%94%BE%E5%A4%A7\">写放大</a></li>\n<li><a href=\"#matrixkv-enabling-techniques\">MatrixKV Enabling Techniques</a></li>\n</ul>\n</li>\n<li><a href=\"#extended-comparisons-on-nvms\">Extended Comparisons on NVMs</a></li>\n</ul>\n</li>\n<li><a href=\"#conclusion\">Conclusion</a></li>\n</ul>\n</li>\n</ul>\n","date":"2020-07-29 16:37:41","dateFormat":"2020-07-29"},{"fileName":"basic-of-persistence-six","abstract":"<blockquote>\n<ul>\n<li>本篇为持久化技术的基础篇系列第六篇（日志结构化文件系统），有对应的原论文 <a href=\"https://dl.acm.org/doi/10.1145/121132.121137\">SOSP1991 - The design and implementation of a log-structured file system</a></li>\n<li>可以参考 <a href=\"https://zhuanlan.zhihu.com/p/41358013\">知乎: Logician - Log-structured File System</a></li>\n</ul>\n</blockquote>\n","description":" 本篇为持久化技术的基础篇系列第六篇（日志结构化文件系统），有对应的原论文 SOSP1991 - The design and implementation of a log-structured file system 可以参考 知乎:...","title":"Series Six of Basic of Persistence -  Log-structured File System","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"读书笔记","slug":"la-n8a0mo","used":true,"link":"https://blog.shunzi.tech/tag/la-n8a0mo/"},{"name":"OS","slug":"os","used":true,"link":"https://blog.shunzi.tech/tag/os/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200717213648.png","link":"https://blog.shunzi.tech/post/basic-of-persistence-six/","stats":{"text":"16 min read","time":919000,"words":4187,"minutes":16},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#chapter-index\">Chapter Index</a></li>\n<li><a href=\"#motivation\">Motivation</a></li>\n<li><a href=\"#lsf\">LSF</a>\n<ul>\n<li><a href=\"#writing-to-disk-sequentially\">Writing To Disk Sequentially</a>\n<ul>\n<li><a href=\"#%E5%A6%82%E4%BD%95%E5%B0%86%E6%89%80%E6%9C%89%E5%AF%B9%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E7%8A%B6%E6%80%81%E7%9A%84%E6%9B%B4%E6%96%B0%E8%BD%AC%E6%8D%A2%E4%B8%BA%E4%B8%80%E7%B3%BB%E5%88%97%E5%AF%B9%E7%A3%81%E7%9B%98%E7%9A%84%E8%BF%9E%E7%BB%AD%E5%86%99%E6%93%8D%E4%BD%9C\">如何将所有对文件系统状态的更新转换为一系列对磁盘的连续写操作？</a></li>\n</ul>\n</li>\n<li><a href=\"#writing-sequentially-and-effectively\">Writing Sequentially And Effectively</a></li>\n<li><a href=\"#how-much-to-buffer\">How Much To Buffer?</a></li>\n<li><a href=\"#problem-finding-inodes\">Problem: Finding Inodes</a>\n<ul>\n<li><a href=\"#solution-through-indirection-the-inode-map\">Solution Through Indirection: The Inode Map</a></li>\n<li><a href=\"#completing-the-solution-the-checkpoint-region\">Completing The Solution: The Checkpoint Region</a></li>\n</ul>\n</li>\n<li><a href=\"#reading-a-file-from-disk-a-recap\">Reading A File From Disk: A Recap</a></li>\n<li><a href=\"#what-about-directories\">What About Directories?</a></li>\n<li><a href=\"#a-new-problem-garbage-collection\">A New Problem: Garbage Collection</a></li>\n<li><a href=\"#determining-block-liveness\">Determining Block Liveness</a></li>\n<li><a href=\"#a-policy-question-which-blocks-to-clean-and-when\">A Policy Question: Which Blocks To Clean, And When?</a></li>\n<li><a href=\"#crash-recovery-and-the-log\">Crash Recovery And The Log</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-07-27 11:40:00","dateFormat":"2020-07-27"},{"fileName":"basic-of-persistence-five","abstract":"<blockquote>\n<ul>\n<li>本篇为持久化技术的基础篇系列第五篇（局部性和 Fast File System），将以 FFS 为例，可以参考原版论文 <a href=\"https://dl.acm.org/doi/10.1145/989.990\">A fast file system for UNIX</a></li>\n</ul>\n</blockquote>\n","description":" 本篇为持久化技术的基础篇系列第五篇（局部性和 Fast File System），将以 FFS 为例，可以参考原版论文 A fast file system for UNIX Chapter Index Basic of Per...","title":"Series Five of Basic of Persistence -  Locality and The Fast File System","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"读书笔记","slug":"la-n8a0mo","used":true,"link":"https://blog.shunzi.tech/tag/la-n8a0mo/"},{"name":"OS","slug":"os","used":true,"link":"https://blog.shunzi.tech/tag/os/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200717213648.png","link":"https://blog.shunzi.tech/post/basic-of-persistence-five/","stats":{"text":"12 min read","time":674000,"words":3120,"minutes":12},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#chapter-index\">Chapter Index</a></li>\n<li><a href=\"#locality-and-the-fast-file-system\">Locality and The Fast File System</a>\n<ul>\n<li><a href=\"#ffs-disk-awareness-is-the-solution\">FFS: Disk Awareness Is The Solution</a></li>\n<li><a href=\"#organizing-structure-the-cylinder-group\">Organizing Structure: The Cylinder Group</a></li>\n<li><a href=\"#policies-how-to-allocate-files-and-directories\">Policies: How To Allocate Files and Directories</a></li>\n<li><a href=\"#measuring-file-locality\">Measuring File Locality</a></li>\n<li><a href=\"#the-large-file-exception\">The Large-File Exception</a></li>\n<li><a href=\"#a-few-other-things-about-ffs\">A Few Other Things About FFS</a>\n<ul>\n<li><a href=\"#sub-blocks\">sub-blocks</a></li>\n<li><a href=\"#disk-layout\">disk layout</a></li>\n<li><a href=\"#other\">other</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-07-23 11:40:00","dateFormat":"2020-07-23"},{"fileName":"basic-of-persistence-four","abstract":"<blockquote>\n<ul>\n<li>本篇为持久化技术的基础篇系列第四篇（文件系统实现），将以 vsfs 为例。</li>\n</ul>\n</blockquote>\n","description":" 本篇为持久化技术的基础篇系列第四篇（文件系统实现），将以 vsfs 为例。 Chapter Index Basic of Persistence Flavor of IO I/O Devices Hard Disk Drive...","title":"Series Four of Basic of Persistence -  File System Implementation","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"读书笔记","slug":"la-n8a0mo","used":true,"link":"https://blog.shunzi.tech/tag/la-n8a0mo/"},{"name":"OS","slug":"os","used":true,"link":"https://blog.shunzi.tech/tag/os/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200717213648.png","link":"https://blog.shunzi.tech/post/basic-of-persistence-four/","stats":{"text":"18 min read","time":1067000,"words":4973,"minutes":18},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#chapter-index\">Chapter Index</a></li>\n<li><a href=\"#file-system-implementation\">File System Implementation</a>\n<ul>\n<li><a href=\"#the-way-to-think\">The Way To Think</a></li>\n<li><a href=\"#overall-organization\">Overall Organization</a></li>\n<li><a href=\"#file-organization-the-inode\">File Organization: The Inode</a>\n<ul>\n<li><a href=\"#the-multi-level-index\">The Multi-Level Index</a></li>\n<li><a href=\"#other\">Other</a></li>\n</ul>\n</li>\n<li><a href=\"#directory-organization\">Directory Organization</a></li>\n<li><a href=\"#free-space-management\">Free Space Management</a></li>\n<li><a href=\"#access-paths-reading-and-writing\">Access Paths: Reading and Writing</a>\n<ul>\n<li><a href=\"#reading-a-file-from-disk\">Reading A File From Disk</a></li>\n<li><a href=\"#writing-a-file-to-disk\">Writing A File To Disk</a></li>\n</ul>\n</li>\n<li><a href=\"#caching-and-buffering\">Caching and Buffering</a></li>\n</ul>\n</li>\n<li><a href=\"#homework\">Homework</a></li>\n</ul>\n</li>\n</ul>\n","date":"2020-07-22 11:40:00","dateFormat":"2020-07-22"},{"fileName":"basic-of-persistence-three","abstract":"<blockquote>\n<ul>\n<li>本篇为持久化技术的基础篇系列第三篇（文件与目录）。</li>\n</ul>\n</blockquote>\n","description":" 本篇为持久化技术的基础篇系列第三篇（文件与目录）。 Chapter Index Basic of Persistence Flavor of IO I/O Devices Hard Disk Drives Files and ...","title":"Series Three of Basic of Persistence -  Files and Directories","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"读书笔记","slug":"la-n8a0mo","used":true,"link":"https://blog.shunzi.tech/tag/la-n8a0mo/"},{"name":"OS","slug":"os","used":true,"link":"https://blog.shunzi.tech/tag/os/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200717213648.png","link":"https://blog.shunzi.tech/post/basic-of-persistence-three/","stats":{"text":"23 min read","time":1362000,"words":5519,"minutes":23},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#chapter-index\">Chapter Index</a></li>\n<li><a href=\"#files-and-directories\">Files and Directories</a>\n<ul>\n<li><a href=\"#files-and-directories-2\">Files and Directories</a></li>\n<li><a href=\"#the-file-system-interface\">The File System Interface</a>\n<ul>\n<li><a href=\"#creating-files\">Creating Files</a></li>\n<li><a href=\"#reading-and-writing-files\">Reading And Writing Files</a></li>\n<li><a href=\"#reading-and-writing-but-not-sequentially\">Reading And Writing, But Not Sequentially</a></li>\n<li><a href=\"#shared-file-table-entries-fork-and-dup\">Shared File Table Entries: fork() And dup()</a></li>\n<li><a href=\"#writing-immediately-with-fsync\">Writing Immediately With fsync()</a></li>\n<li><a href=\"#renaming-files\">Renaming Files</a></li>\n<li><a href=\"#getting-information-about-files\">Getting Information About Files</a></li>\n<li><a href=\"#removing-files\">Removing Files</a></li>\n<li><a href=\"#making-directories\">Making Directories</a></li>\n<li><a href=\"#reading-directories\">Reading Directories</a></li>\n<li><a href=\"#deleting-directories\">Deleting Directories</a></li>\n<li><a href=\"#hard-links\">Hard Links</a></li>\n<li><a href=\"#symbolic-links-soft-links\">Symbolic Links (Soft Links)</a></li>\n</ul>\n</li>\n<li><a href=\"#permission-bits-and-access-control-lists\">Permission Bits And Access Control Lists</a><br>\n*\n<ul>\n<li><a href=\"#permission-bits\">Permission bits</a></li>\n<li><a href=\"#acl\">ACL</a></li>\n</ul>\n</li>\n<li><a href=\"#making-and-mounting-a-file-system\">Making And Mounting A File System</a></li>\n<li><a href=\"#homework\">Homework</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-07-21 11:40:00","dateFormat":"2020-07-21"},{"fileName":"basic-of-persistence-two","abstract":"<blockquote>\n<ul>\n<li>本篇为持久化技术的基础篇系列第二篇（硬盘设备和磁盘阵列），即一些硬件设备基础知识以及基础的 IO 处理相关知识，可以结合之前的一篇博客 <a href=\"https://blog.shunzi.tech/post/flavor-of-io/\">Flavor of IO</a>。</li>\n</ul>\n</blockquote>\n","description":" 本篇为持久化技术的基础篇系列第二篇（硬盘设备和磁盘阵列），即一些硬件设备基础知识以及基础的 IO 处理相关知识，可以结合之前的一篇博客 Flavor of IO。 Chapter Index Basic of Persisten...","title":"Series Two of Basic of Persistence - Hard Disk Drives And RAID","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"读书笔记","slug":"la-n8a0mo","used":true,"link":"https://blog.shunzi.tech/tag/la-n8a0mo/"},{"name":"OS","slug":"os","used":true,"link":"https://blog.shunzi.tech/tag/os/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200717213648.png","link":"https://blog.shunzi.tech/post/basic-of-persistence-two/","stats":{"text":"10 min read","time":557000,"words":2545,"minutes":10},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#chapter-index\">Chapter Index</a></li>\n<li><a href=\"#hard-disk-drives\">Hard Disk Drives</a>\n<ul>\n<li><a href=\"#the-interface\">The Interface</a></li>\n<li><a href=\"#basic-geometry\">Basic Geometry</a></li>\n<li><a href=\"#disk-scheduling\">Disk Scheduling</a>\n<ul>\n<li><a href=\"#sstf-shortest-seek-time-first\">SSTF: Shortest Seek Time First</a></li>\n<li><a href=\"#elevator-aka-scan-or-c-scan\">Elevator (a.k.a. SCAN or C-SCAN)</a></li>\n<li><a href=\"#sptf-shortest-positioning-time-first\">SPTF: Shortest Positioning Time First</a></li>\n<li><a href=\"#other-scheduling-issues\">Other Scheduling issues</a></li>\n</ul>\n</li>\n<li><a href=\"#homework-simulation\">Homework (Simulation)</a></li>\n</ul>\n</li>\n<li><a href=\"#redundant-arrays-of-inexpensive-disks-raids\">Redundant Arrays of Inexpensive Disks (RAIDs)</a>\n<ul>\n<li><a href=\"#interface-and-raid-internals\">Interface And RAID Internals</a></li>\n<li><a href=\"#fault-model\">Fault Model</a></li>\n<li><a href=\"#how-to-evaluate-a-raid\">How To Evaluate A RAID</a></li>\n<li><a href=\"#different-raids\">Different RAIDS</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-07-20 11:40:00","dateFormat":"2020-07-20"},{"fileName":"basic-of-persistence-one","abstract":"<blockquote>\n<ul>\n<li>本篇为持久化技术的基础篇系列第一篇（I/O 设备），即一些硬件设备基础知识以及基础的 IO 处理相关知识，可以结合之前的一篇博客 <a href=\"https://blog.shunzi.tech/post/flavor-of-io/\">Flavor of IO</a>。</li>\n</ul>\n</blockquote>\n","description":" 本篇为持久化技术的基础篇系列第一篇（I/O 设备），即一些硬件设备基础知识以及基础的 IO 处理相关知识，可以结合之前的一篇博客 Flavor of IO。 Chapter Index Basic of Persistence ...","title":"Series One of Basic of Persistence - I/O Devices","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"读书笔记","slug":"la-n8a0mo","used":true,"link":"https://blog.shunzi.tech/tag/la-n8a0mo/"},{"name":"OS","slug":"os","used":true,"link":"https://blog.shunzi.tech/tag/os/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200717213648.png","link":"https://blog.shunzi.tech/post/basic-of-persistence-one/","stats":{"text":"14 min read","time":830000,"words":3643,"minutes":14},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#chapter-index\">Chapter Index</a></li>\n</ul>\n</li>\n<li><a href=\"#basic-of-persistence\">Basic of Persistence</a>\n<ul>\n<li><a href=\"#before-persistence\">Before Persistence</a></li>\n<li><a href=\"#io-devices\">I/O Devices</a>\n<ul>\n<li><a href=\"#system-architecture\">System Architecture</a></li>\n<li><a href=\"#a-canonical-device-and-the-canonical-protocol\">A Canonical Device and The Canonical Protocol</a>\n<ul>\n<li><a href=\"#device\">Device</a></li>\n<li><a href=\"#protocol\">Protocol</a></li>\n</ul>\n</li>\n<li><a href=\"#lowering-cpu-overhead-with-interrupts\">Lowering CPU Overhead With Interrupts</a></li>\n<li><a href=\"#more-efficient-data-movement-with-dma\">More Efficient Data Movement With DMA</a>\n<ul>\n<li><a href=\"#solution-dma\">Solution DMA</a></li>\n</ul>\n</li>\n<li><a href=\"#methods-of-device-interaction\">Methods Of Device Interaction</a>\n<ul>\n<li><a href=\"#io-instructions\">I/O instructions</a></li>\n<li><a href=\"#memory-mapped-io\">Memory-mapped I/O</a></li>\n</ul>\n</li>\n<li><a href=\"#fitting-into-the-os-the-device-driver\">Fitting Into The OS: The Device Driver</a></li>\n<li><a href=\"#case-study-a-simple-ide-disk-driver\">Case Study: A Simple IDE Disk Driver</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-07-18 11:40:00","dateFormat":"2020-07-18"},{"fileName":"dist-block-consistency","abstract":"<blockquote>\n<ul>\n<li>源于最近的项目里涉及到的一致性问题，此处是指存储系统内部的数据一致性。</li>\n<li>注意和 <a href=\"https://blog.shunzi.tech/post/distributed-system-consistency/\">分布式系统中的一致性以及协同算法</a> 进行区分，此处更多的是多层存储之间的一致性。</li>\n<li>主要会先了解记录常见的存储系统中的数据一致性保证，如文件系统、数据库等；再分析项目中是否真正数据存在一致性问题。</li>\n</ul>\n</blockquote>\n","description":" 源于最近的项目里涉及到的一致性问题，此处是指存储系统内部的数据一致性。 注意和 分布式系统中的一致性以及协同算法 进行区分，此处更多的是多层存储之间的一致性。 主要会先了解记录常见的存储系统中的数据一致性保证，如文件系统、数据库等；再分...","title":"存储系统中的一致性","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"一致性","slug":"oBVOD8v4ou","used":true,"link":"https://blog.shunzi.tech/tag/oBVOD8v4ou/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200714212210.png","link":"https://blog.shunzi.tech/post/dist-block-consistency/","stats":{"text":"29 min read","time":1701000,"words":7546,"minutes":29},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li><a href=\"#%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E4%B8%AD%E7%9A%84%E4%B8%80%E8%87%B4%E6%80%A7\">文件系统中的一致性</a>\n<ul>\n<li><a href=\"#%E5%89%8D%E8%A8%80\">前言</a>\n<ul>\n<li><a href=\"#%E9%A2%84%E5%A4%87%E7%9F%A5%E8%AF%86\">预备知识</a></li>\n<li><a href=\"#%E9%97%AE%E9%A2%98\">问题</a>\n<ul>\n<li><a href=\"#%E4%B8%80%E8%87%B4%E6%80%A7%E6%A6%82%E5%BF%B5\">一致性概念</a></li>\n<li><a href=\"#%E5%BD%B1%E5%93%8D\">影响</a></li>\n</ul>\n</li>\n<li><a href=\"#%E9%9C%80%E6%B1%82\">需求</a>\n<ul>\n<li><a href=\"#linux-%E4%B8%8B%E7%9A%84%E6%96%B9%E6%A1%88\">Linux 下的方案</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E4%B8%80%E8%87%B4%E6%80%A7%E5%AE%9E%E7%8E%B0\">一致性实现</a>\n<ul>\n<li><a href=\"#%E6%96%87%E4%BB%B6%E4%B8%80%E8%87%B4%E6%80%A7%E6%8E%A5%E5%8F%A3\">文件一致性接口</a>\n<ul>\n<li><a href=\"#fsync\">fsync</a></li>\n<li><a href=\"#fdatasync\">fdatasync</a></li>\n<li><a href=\"#sync\">sync</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E8%A2%AB%E5%8A%A8%E4%B8%80%E8%87%B4%E6%80%A7\">被动一致性</a>\n<ul>\n<li><a href=\"#%E7%AE%A1%E7%90%86%E7%BA%BF%E7%A8%8B\">管理线程</a></li>\n<li><a href=\"#%E5%B7%A5%E4%BD%9C%E7%BA%BF%E7%A8%8B\">工作线程</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%B4%A9%E6%BA%83%E4%B8%80%E8%87%B4%E6%80%A7\">崩溃一致性</a>\n<ul>\n<li><a href=\"#example\">Example</a></li>\n<li><a href=\"#crash-scenarios\">Crash Scenarios</a>\n<ul>\n<li><a href=\"#single-write-success\">Single Write Success</a></li>\n<li><a href=\"#two-writes-success-single-failure\">Two writes Success (Single failure)</a></li>\n<li><a href=\"#summary\">Summary</a></li>\n</ul>\n</li>\n<li><a href=\"#solutions\">Solutions</a>\n<ul>\n<li><a href=\"#solution1-the-file-system-checker-fsck\">Solution#1 The File System Checker (FSCK)</a></li>\n<li><a href=\"#solution2-journaling-or-wal\">Solution#2 Journaling (or WAL)</a>\n<ul>\n<li><a href=\"#data-journaling\">Data Journaling</a>\n<ul>\n<li><a href=\"#%E6%81%A2%E5%A4%8D\">恢复</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#data-journaling-%E9%97%AE%E9%A2%98\">data journaling 问题</a>\n<ul>\n<li><a href=\"#redundant-write-batching-log-updates\">redundant write （Batching Log Updates）</a></li>\n<li><a href=\"#space\">Space</a>\n<ul>\n<li><a href=\"#making-the-log-finite\">Making The Log Finite</a></li>\n<li><a href=\"#metadata-journaling\">Metadata Journaling</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#tricky-case-block-reuse\">Tricky Case: Block Reuse</a></li>\n<li><a href=\"#solution3-other-approaches\">Solution#3 Other Approaches</a>\n<ul>\n<li><a href=\"#soft-updates\">Soft Updates</a></li>\n<li><a href=\"#cow-copy-on-write\">CoW Copy-On-Write</a></li>\n<li><a href=\"#backpointer-based-consistency\">backpointer-based consistency</a></li>\n<li><a href=\"#optimistic-crash-consistency\">optimistic crash consistency</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E5%B4%A9%E6%BA%83%E4%B8%80%E8%87%B4%E6%80%A7%E6%B5%8B%E8%AF%95\">文件系统崩溃一致性测试</a></li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE\">参考文献</a></li>\n</ul>\n</li>\n</ul>\n","date":"2020-07-15 12:21:02","dateFormat":"2020-07-15"},{"fileName":"AI-for-Systems-index","abstract":"<blockquote>\n<ul>\n<li>Index for AI-4-Systems researches.</li>\n<li>Some aspects in intelligent storage field.</li>\n<li>Continuous update.</li>\n</ul>\n</blockquote>\n","description":" Index for AI-4-Systems researches. Some aspects in intelligent storage field. Continuous update. AI For Systems Dis...","title":"AI For System Papers Index","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"AI","slug":"gqgftpk_y","used":true,"link":"https://blog.shunzi.tech/tag/gqgftpk_y/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200714203149.png","link":"https://blog.shunzi.tech/post/AI-for-Systems-index/","stats":{"text":"3 min read","time":166000,"words":443,"minutes":3},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#ai-for-systems\">AI For Systems</a>\n<ul>\n<li><a href=\"#disk-failure-prediction\">Disk Failure Prediction</a></li>\n<li><a href=\"#storage-system-tuning\">Storage System Tuning</a></li>\n<li><a href=\"#optimize-io-behavior\">Optimize IO Behavior</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-07-14 20:32:20","dateFormat":"2020-07-14"},{"fileName":"database-internal-lsm-tree-summary","abstract":"<blockquote>\n<ul>\n<li>The LSM-tree basic in database system.</li>\n</ul>\n</blockquote>\n","description":" The LSM-tree basic in database system. The LSM-tree basic in database system. Here is the basic of LSM-tree, incl...","title":"Database Internal - LSM-tree Summary","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"数据库","slug":"shu-ju-ku","used":true,"link":"https://blog.shunzi.tech/tag/shu-ju-ku/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/微信截图_20200709152604.png","link":"https://blog.shunzi.tech/post/database-internal-lsm-tree-summary/","stats":{"text":"40 min read","time":2394000,"words":6386,"minutes":40},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#before-lsm-tree\">Before LSM-tree</a>\n<ul>\n<li><a href=\"#immutable-structures\">Immutable Structures</a></li>\n</ul>\n</li>\n<li><a href=\"#lsm-tree\">LSM-Tree</a>\n<ul>\n<li><a href=\"#lsm-structure\">LSM Structure</a>\n<ul>\n<li><a href=\"#two-components\">Two components</a></li>\n<li><a href=\"#multicomponent-lsm-trees\">Multicomponent LSM Trees</a></li>\n<li><a href=\"#in-memory-tables\">In-memory Tables</a>\n<ul>\n<li><a href=\"#crash-consistency\">Crash Consistency</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#updates-and-deletes\">Updates And Deletes</a>\n<ul>\n<li><a href=\"#delete\">Delete</a>\n<ul>\n<li><a href=\"#single-key-value\">Single Key-Value</a></li>\n<li><a href=\"#range-key-value\">Range Key-Value</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#lsm-tree-lookups\">LSM Tree Lookups</a>\n<ul>\n<li><a href=\"#merge-iteration\">Merge-Iteration</a>\n<ul>\n<li><a href=\"#steps\">Steps:</a></li>\n<li><a href=\"#overhead\">Overhead</a></li>\n</ul>\n</li>\n<li><a href=\"#reconciliation\">Reconciliation</a></li>\n<li><a href=\"#maintenance-in-lsm-trees\">Maintenance in LSM Trees</a>\n<ul>\n<li><a href=\"#leveled-compaction\">Leveled Compaction</a></li>\n<li><a href=\"#size-tiered-compaction\">Size-tiered compaction</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#read-write-and-space-amplification\">Read, Write, and Space Amplification</a></li>\n<li><a href=\"#implementation-details\">Implementation Details</a>\n<ul>\n<li><a href=\"#sorted-string-tables\">Sorted String Tables</a>\n<ul>\n<li><a href=\"#index-files\">Index files</a></li>\n<li><a href=\"#data-files\">Data files</a></li>\n<li><a href=\"#sstable-attached-secondary-indexes\">SSTable-Attached Secondary Indexes</a></li>\n</ul>\n</li>\n<li><a href=\"#bloom-filters\">Bloom Filters</a></li>\n<li><a href=\"#skiplist\">Skiplist</a>\n<ul>\n<li><a href=\"#lookup-example\">Lookup Example</a></li>\n<li><a href=\"#insert\">Insert</a></li>\n<li><a href=\"#delete-2\">Delete</a></li>\n<li><a href=\"#other\">Other</a></li>\n</ul>\n</li>\n<li><a href=\"#disk-access\">Disk Access</a></li>\n<li><a href=\"#compression\">Compression</a></li>\n</ul>\n</li>\n<li><a href=\"#unordered-lsm-storage\">Unordered LSM Storage</a>\n<ul>\n<li><a href=\"#bitcask\">Bitcask</a>\n<ul>\n<li><a href=\"#benefits-and-disadvantages\">Benefits and Disadvantages</a></li>\n</ul>\n</li>\n<li><a href=\"#wisckey\">WiscKey</a></li>\n</ul>\n</li>\n<li><a href=\"#concurrency-in-lsm-trees\">Concurrency in LSM Trees</a>\n<ul>\n<li><a href=\"#flush-rules\">Flush Rules</a></li>\n<li><a href=\"#approaches\">Approaches</a>\n<ul>\n<li><a href=\"#synchronization-points\">Synchronization points</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#log-stacking\">Log Stacking</a>\n<ul>\n<li><a href=\"#ftl-flash-translation-layer\">FTL Flash Translation Layer</a>\n<ul>\n<li><a href=\"#summary\">Summary</a></li>\n</ul>\n</li>\n<li><a href=\"#filesystem-logging\">Filesystem Logging</a></li>\n</ul>\n</li>\n<li><a href=\"#llama-and-mindful-stacking\">LLAMA and Mindful Stacking</a>\n<ul>\n<li><a href=\"#open-channel-ssds\">Open-Channel SSDs</a></li>\n</ul>\n</li>\n<li><a href=\"#summary-2\">Summary</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-07-05 11:40:00","dateFormat":"2020-07-05"},{"fileName":"database-internal-b-tree-summary","abstract":"<blockquote>\n<ul>\n<li>The B-tree basic in database system.</li>\n</ul>\n</blockquote>\n","description":" The B-tree basic in database system. The B-tree basic in database system. Here is the basic of B-tree, including ...","title":"Database Internal - B-tree Summary","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"数据库","slug":"shu-ju-ku","used":true,"link":"https://blog.shunzi.tech/tag/shu-ju-ku/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200614213040.png","link":"https://blog.shunzi.tech/post/database-internal-b-tree-summary/","stats":{"text":"43 min read","time":2522000,"words":6732,"minutes":43},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#before-b-tree\">Before B-Tree</a></li>\n<li><a href=\"#b-tree\">B-Tree</a>\n<ul>\n<li><a href=\"#binary-search-tree-bst\">Binary Search Tree (BST)</a></li>\n<li><a href=\"#tree-balancing\">Tree Balancing</a>\n<ul>\n<li><a href=\"#why-need-balancing\">Why need balancing ?</a></li>\n<li><a href=\"#how-to-balance\">How to balance?</a></li>\n</ul>\n</li>\n<li><a href=\"#trees-for-disk-based-storage\">Trees for Disk-Based Storage</a>\n<ul>\n<li><a href=\"#problems\">Problems</a></li>\n<li><a href=\"#requirements\">Requirements</a></li>\n</ul>\n</li>\n<li><a href=\"#disk-based-structures\">Disk-Based Structures</a>\n<ul>\n<li><a href=\"#hard-disk-drives\">Hard Disk Drives</a></li>\n<li><a href=\"#solid-state-drives\">Solid State Drives</a></li>\n<li><a href=\"#on-disk-structures\">On-Disk Structures</a>\n<ul>\n<li><a href=\"#limitations\">Limitations</a></li>\n<li><a href=\"#ideas\">Ideas</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#paged-binary-trees\">Paged Binary Trees</a></li>\n<li><a href=\"#ubiquitous-b-trees\">Ubiquitous B-Trees</a>\n<ul>\n<li><a href=\"#b-tree-hierarchy\">B-Tree Hierarchy</a>\n<ul>\n<li><a href=\"#components\">Components</a></li>\n<li><a href=\"#concepts\">Concepts</a></li>\n</ul>\n</li>\n<li><a href=\"#b-trees\">B+ Trees</a></li>\n<li><a href=\"#separator-keys\">Separator Keys</a>\n<ul>\n<li><a href=\"#how-to-build-b-tree\">How to build B-Tree?</a></li>\n</ul>\n</li>\n<li><a href=\"#b-tree-lookup-complexity\">B-Tree Lookup Complexity</a>\n<ul>\n<li><a href=\"#block-transfers\">Block transfers</a></li>\n<li><a href=\"#comparisons-done-during-the-lookup\">Comparisons done during the lookup</a></li>\n</ul>\n</li>\n<li><a href=\"#b-tree-lookup-algorithm\">B-Tree Lookup Algorithm</a></li>\n<li><a href=\"#couting-keys\">Couting Keys</a></li>\n<li><a href=\"#b-tree-node-splits\">B-Tree Node Splits</a>\n<ul>\n<li><a href=\"#steps\">Steps</a></li>\n</ul>\n</li>\n<li><a href=\"#b-tree-node-merges\">B-Tree Node Merges</a>\n<ul>\n<li><a href=\"#merge-conditions\">Merge Conditions</a>\n<ul>\n<li><a href=\"#how-to-merge-nodes\">How to merge nodes</a></li>\n</ul>\n</li>\n<li><a href=\"#steps-2\">Steps</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#summary\">Summary</a></li>\n</ul>\n</li>\n<li><a href=\"#file-formats\">File Formats</a>\n<ul>\n<li><a href=\"#motivation\">Motivation</a></li>\n<li><a href=\"#binary-encoding\">Binary Encoding</a>\n<ul>\n<li><a href=\"#primitive-types\">Primitive Types</a>\n<ul>\n<li><a href=\"#number\">Number</a></li>\n<li><a href=\"#strings-and-variable-size-data\">Strings and Variable-Size Data</a></li>\n<li><a href=\"#bit-packed-data-booleans-enums-and-flags\">Bit-Packed Data: Booleans, Enums, and Flags</a></li>\n</ul>\n</li>\n<li><a href=\"#general-principles\">General Principles</a></li>\n<li><a href=\"#page-structure\">Page Structure</a></li>\n<li><a href=\"#slotted-pages\">Slotted Pages</a>\n<ul>\n<li><a href=\"#goal\">Goal</a></li>\n<li><a href=\"#slotted-page\">Slotted Page</a></li>\n</ul>\n</li>\n<li><a href=\"#cell-layout\">Cell Layout</a>\n<ul>\n<li><a href=\"#key-cell\">Key Cell</a>\n<ul>\n<li><a href=\"#key-value-cells\">Key-Value Cells</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#combining-cells-into-slotted-pages\">Combining Cells into Slotted Pages</a></li>\n<li><a href=\"#managing-variable-size-data\">Managing Variable-Size Data</a>\n<ul>\n<li><a href=\"#strategy-to-calculate-fit\">Strategy to calculate fit</a></li>\n<li><a href=\"#others\">Others</a></li>\n<li><a href=\"#summary-2\">Summary</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#versioning\">Versioning</a></li>\n<li><a href=\"#checksumming\">Checksumming</a></li>\n</ul>\n</li>\n<li><a href=\"#implementing-b-trees\">Implementing B-Trees</a>\n<ul>\n<li><a href=\"#page-header\">Page Header</a>\n<ul>\n<li><a href=\"#magic-numbers\">Magic Numbers</a></li>\n<li><a href=\"#sibling-links\">Sibling Links</a></li>\n<li><a href=\"#rightmost-pointers\">Rightmost Pointers</a></li>\n<li><a href=\"#node-high-keys\">Node High Keys</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-06-14 11:40:00","dateFormat":"2020-06-14"},{"fileName":"amplification-and-rum","abstract":"<blockquote>\n<ul>\n<li>Distributed Storage System Basic Serie 2 - Amplification and RUM.</li>\n</ul>\n</blockquote>\n","description":" Distributed Storage System Basic Serie 2 - Amplification and RUM. Here is the concept of Amplification and RUM in...","title":"Amplification and RUM","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"分布式","slug":"geK0jEW-T","used":true,"link":"https://blog.shunzi.tech/tag/geK0jEW-T/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200612193331.png","link":"https://blog.shunzi.tech/post/amplification-and-rum/","stats":{"text":"11 min read","time":645000,"words":1722,"minutes":11},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#read-write-space-amplification-pick-2\">Read, write &amp; space amplification - pick 2</a>\n<ul>\n<li><a href=\"#purpose\">Purpose</a></li>\n<li><a href=\"#read-amp\">Read Amp</a></li>\n<li><a href=\"#write-amp\">Write Amp</a></li>\n<li><a href=\"#space-amp\">Space Amp</a></li>\n</ul>\n</li>\n<li><a href=\"#the-rum-conjecture\">The RUM Conjecture</a>\n<ul>\n<li><a href=\"#rum-space\">Rum Space</a></li>\n<li><a href=\"#rum-conjecture\">Rum Conjecture</a></li>\n<li><a href=\"#rum-overheads-in-access-methods\">Rum Overheads in Access Methods</a></li>\n<li><a href=\"#toward-rum-aware-access-methods\">Toward Rum-Aware Access Methods</a></li>\n</ul>\n</li>\n<li><a href=\"#crum-conjecture-read-write-space-and-cache-amplification\">CRUM conjecture - read, write, space and cache amplification</a>\n<ul>\n<li><a href=\"#cache-amplification\">Cache Amplification</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-06-13 11:40:00","dateFormat":"2020-06-13"},{"fileName":"flavor-of-io","abstract":"<blockquote>\n<ul>\n<li>Distributed Storage System Basic Serie 1 - Flavor of IO.</li>\n</ul>\n</blockquote>\n","description":" Distributed Storage System Basic Serie 1 - Flavor of IO. Distributed Storage System Basic Serie 1 - Flavor of IO....","title":"Flavor of IO","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200612094331.png","link":"https://blog.shunzi.tech/post/flavor-of-io/","stats":{"text":"12 min read","time":679000,"words":1822,"minutes":12},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#disk-io\">Disk I/O</a>\n<ul>\n<li><a href=\"#flavors-of-io\">Flavors of I/O</a>\n<ul>\n<li><a href=\"#io-api\">I/O API</a>\n<ul>\n<li><a href=\"#system-io\">System I/O</a></li>\n<li><a href=\"#stream-io\">Stream I/O</a></li>\n<li><a href=\"#memory-mapped-io\">Memory mapped IO</a></li>\n</ul>\n</li>\n<li><a href=\"#sectorblockpage\">Sector/Block/Page</a></li>\n<li><a href=\"#standard-io\">Standard IO</a>\n<ul>\n<li><a href=\"#page-cache\">Page Cache</a></li>\n<li><a href=\"#direct-io\">Direct IO</a></li>\n<li><a href=\"#block-alignment\">Block Alignment</a></li>\n<li><a href=\"#nonblocking-filesystem-io\">Nonblocking FileSystem IO</a></li>\n</ul>\n</li>\n<li><a href=\"#memory-mapping\">Memory Mapping</a></li>\n<li><a href=\"#page-cache-optimization\">Page cache optimization</a></li>\n<li><a href=\"#aio\">AIO</a>\n<ul>\n<li><a href=\"#io_submit\">io_submit</a></li>\n<li><a href=\"#io_getevents\">io_getevents</a></li>\n<li><a href=\"#others\">Others</a></li>\n</ul>\n</li>\n<li><a href=\"#vectored-io\">Vectored IO</a>\n<ul>\n<li><a href=\"#advantages\">Advantages</a></li>\n<li><a href=\"#usage\">Usage</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#reference\">Reference</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-06-12 13:40:00","dateFormat":"2020-06-12"},{"fileName":"distributed-storage-system-basic","abstract":"<blockquote>\n<ul>\n<li>Distributed Storage System Basic.</li>\n</ul>\n</blockquote>\n","description":" Distributed Storage System Basic. Distributed Storage System Basic. Here is the basic of storage and distributed ...","title":"Distributed Storage System Basic","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"分布式","slug":"geK0jEW-T","used":true,"link":"https://blog.shunzi.tech/tag/geK0jEW-T/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200612084833.png","link":"https://blog.shunzi.tech/post/distributed-storage-system-basic/","stats":{"text":"5 min read","time":271000,"words":723,"minutes":5},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#basic\">Basic</a>\n<ul>\n<li><a href=\"#index-of-reading-list\">Index of Reading List</a>\n<ul>\n<li><a href=\"#storage-engine\">Storage Engine</a>\n<ul>\n<li><a href=\"#disk-io\">Disk I/O</a></li>\n<li><a href=\"#b-tree-optional\">B-Tree (Optional)</a></li>\n<li><a href=\"#lsm-tree\">LSM-Tree</a></li>\n<li><a href=\"#lsm-tree-evolution\">LSM-Tree Evolution</a></li>\n</ul>\n</li>\n<li><a href=\"#serializing-rpc\">Serializing &amp; RPC</a>\n<ul>\n<li><a href=\"#protocol-buffer\">Protocol Buffer</a></li>\n<li><a href=\"#grpc\">gRPC</a></li>\n</ul>\n</li>\n<li><a href=\"#data-partitioning\">Data Partitioning</a></li>\n<li><a href=\"#replication-consistency\">Replication &amp; Consistency</a></li>\n<li><a href=\"#consensus\">Consensus</a></li>\n<li><a href=\"#scale-balance\">Scale &amp; Balance</a></li>\n<li><a href=\"#distributed-transactions\">Distributed Transactions</a></li>\n<li><a href=\"#coprocessor-optional\">Coprocessor (Optional)</a></li>\n<li><a href=\"#benchmark-testing\">Benchmark &amp; Testing</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#summary\">Summary</a>\n<ul>\n<li><a href=\"#index\">Index</a><br>\n*\n<ul>\n<li><a href=\"#disk-io-2\">Disk I/O</a></li>\n<li><a href=\"#b-tree\">B-Tree</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-06-12 11:40:00","dateFormat":"2020-06-12"},{"fileName":"head-first-go-lang","abstract":"<blockquote>\n<ul>\n<li>Head first Golang.</li>\n<li>Here is the basic of go-language, including grammer basic and some features.</li>\n<li>The content is based on the tutorial <a href=\"https://tour.golang.org/welcome/1\">A tour of Go</a> and I will present my understanding.</li>\n<li>Furthermore, I will try to anaylyze the priciple</li>\n</ul>\n</blockquote>\n","description":" Head first Golang. Here is the basic of go-language, including grammer basic and some features. The content is based o...","title":"Head First Golang","tags":[{"name":"编程语言","slug":"n2w6bz87h","used":true,"link":"https://blog.shunzi.tech/tag/n2w6bz87h/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200611220832.png","link":"https://blog.shunzi.tech/post/head-first-go-lang/","stats":{"text":"13 min read","time":736000,"words":2103,"minutes":13},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#basic\">Basic</a>\n<ul>\n<li><a href=\"#index-of-a-tour-of-go\">Index of A tour of Go</a>\n<ul>\n<li><a href=\"#basic-2\">Basic</a></li>\n<li><a href=\"#methods-and-interfaces\">Methods and Interfaces</a></li>\n<li><a href=\"#concurrency\">Concurrency</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-06-11 21:40:00","dateFormat":"2020-06-11"},{"fileName":"s3fs","abstract":"<blockquote>\n<ul>\n<li>FUSE-based file system backed by Amazon S3</li>\n<li>基于对象存储的文件系统，国内有 aliyun/ossfs, huaweicloud/obsfs</li>\n<li>本质是实现了将对象存储的 Bucket 挂载到了本地文件系统中，从而通过本地文件系统操作 OSS 上的对象</li>\n</ul>\n</blockquote>\n","description":" FUSE-based file system backed by Amazon S3 基于对象存储的文件系统，国内有 aliyun/ossfs, huaweicloud/obsfs 本质是实现了将对象存储的 Bucket 挂载到了本地文...","title":"S3FS","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"对象存储","slug":"ZnIN9Ge-w","used":true,"link":"https://blog.shunzi.tech/tag/ZnIN9Ge-w/"},{"name":"云计算","slug":"4zx4ysLGro","used":true,"link":"https://blog.shunzi.tech/tag/4zx4ysLGro/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200522175313.png","link":"https://blog.shunzi.tech/post/s3fs/","stats":{"text":"18 min read","time":1077000,"words":3678,"minutes":18},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li><a href=\"#s3fs\">S3FS</a>\n<ul>\n<li><a href=\"#overfiew\">Overfiew</a></li>\n<li><a href=\"#dependency\">Dependency</a>\n<ul>\n<li><a href=\"#fuse\">FUSE</a></li>\n<li><a href=\"#s3-standard-object-storage\">S3 Standard Object Storage</a></li>\n</ul>\n</li>\n<li><a href=\"#features\">Features</a></li>\n<li><a href=\"#limitations\">Limitations</a></li>\n<li><a href=\"#%E5%8E%9F%E7%90%86\">原理</a>\n<ul>\n<li><a href=\"#%E6%9C%BA%E5%88%B6\">机制</a>\n<ul>\n<li><a href=\"#1%E8%AF%BB%E5%8F%96%E6%96%87%E4%BB%B6\">1.读取文件</a></li>\n<li><a href=\"#2%E6%96%87%E4%BB%B6%E9%80%BB%E8%BE%91%E6%9E%B6%E6%9E%84\">2.文件逻辑架构</a>\n<ul>\n<li><a href=\"#%E7%BB%84%E6%88%90\"><strong>组成</strong>：</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#io-%E6%B5%81%E7%A8%8B\">IO 流程</a>\n<ul>\n<li><a href=\"#%E8%AF%BB%E5%8F%96%E6%96%87%E4%BB%B6%E6%B5%81%E7%A8%8B\">读取文件流程</a>\n<ul>\n<li><a href=\"#read-op\">Read OP</a></li>\n<li><a href=\"#write-op\">Write OP</a></li>\n</ul>\n</li>\n<li><a href=\"#%E8%AF%BB%E5%8F%96%E6%96%87%E4%BB%B6%E7%BD%91%E7%BB%9C%E8%AF%B7%E6%B1%82%E6%B5%81%E7%A8%8B\">读取文件网络请求流程</a>\n<ul>\n<li><a href=\"#%E8%AF%B7%E6%B1%82-s3\">请求 S3</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E6%BA%90%E7%A0%81\">源码</a>\n<ul>\n<li><a href=\"#%E5%8E%9F%E7%90%86%E6%A6%82%E8%BF%B0\">原理概述：</a></li>\n<li><a href=\"#%E4%BB%A3%E7%A0%81%E7%BB%93%E6%9E%84\">代码结构</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E5%90%8C%E7%B1%BB%E4%BA%A7%E5%93%81\">同类产品</a>\n<ul>\n<li><a href=\"#ossfs-alicloud\">ossfs AliCloud</a></li>\n<li><a href=\"#obsfs-huaweicloud\">obsfs HuaweiCloud</a></li>\n<li><a href=\"#references\">References</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\">参考链接</a></li>\n</ul>\n</li>\n</ul>\n","date":"2020-05-22 18:24:34","dateFormat":"2020-05-22"},{"fileName":"BigTable-A-Distributed-Storage-System-for-Structured-Data","abstract":"<blockquote>\n<ul>\n<li>2006 年 Google 发表的 Bigtable (Google 三大论文 GFS/MapReduce/BigTable 之一). 原文链接见参考链接【1】</li>\n</ul>\n</blockquote>\n","description":" 2006 年 Google 发表的 Bigtable (Google 三大论文 GFS/MapReduce/BigTable 之一). 原文链接见参考链接【1】 2006 年 Google 发表的 Bigtable (Goog...","title":"Bigtable: A Distributed Storage System for Structured Data","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"LSM","slug":"_jfuTNqah","used":true,"link":"https://blog.shunzi.tech/tag/_jfuTNqah/"},{"name":"对象存储","slug":"ZnIN9Ge-w","used":true,"link":"https://blog.shunzi.tech/tag/ZnIN9Ge-w/"}],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/BigTable_database_large.jpg","link":"https://blog.shunzi.tech/post/BigTable-A-Distributed-Storage-System-for-Structured-Data/","stats":{"text":"28 min read","time":1632000,"words":7357,"minutes":28},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#abstract\">Abstract</a></li>\n<li><a href=\"#data-model\">Data Model</a>\n<ul>\n<li><a href=\"#rows\">Rows</a>\n<ul>\n<li><a href=\"#eg\">eg.</a></li>\n</ul>\n</li>\n<li><a href=\"#column-families\">Column Families</a>\n<ul>\n<li><a href=\"#eg-2\">eg.</a></li>\n</ul>\n</li>\n<li><a href=\"#timestamps\">Timestamps</a>\n<ul>\n<li><a href=\"#eg-3\">eg.</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%95%B0%E6%8D%AE%E7%A4%BA%E4%BE%8B\">数据示例</a></li>\n</ul>\n</li>\n<li><a href=\"#api\">API</a>\n<ul>\n<li><a href=\"#eg1\">eg.1</a></li>\n<li><a href=\"#eg2\">eg.2</a></li>\n<li><a href=\"#eg3\">eg.3</a></li>\n</ul>\n</li>\n<li><a href=\"#building-blocks\">Building Blocks</a>\n<ul>\n<li><a href=\"#sstable-%E5%AD%98%E5%82%A8-bigtable-%E6%95%B0%E6%8D%AE\">SSTable 存储 BigTable 数据</a>\n<ul>\n<li><a href=\"#%E8%AF%BB\">读</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81-chubby\">分布式锁 Chubby</a>\n<ul>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\">参考链接</a></li>\n<li><a href=\"#bigtable-with-chubby\">BigTable With Chubby</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#implementation\">Implementation</a>\n<ul>\n<li><a href=\"#components\">Components</a>\n<ul>\n<li><a href=\"#master-server\">Master Server</a></li>\n<li><a href=\"#tablet-server\">Tablet Server</a>\n<ul>\n<li><a href=\"#tablet-server-table\">Tablet Server &amp; Table</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#tablet-location\">Tablet Location</a></li>\n<li><a href=\"#tablet-assignment\">Tablet Assignment</a></li>\n<li><a href=\"#tablet-serving\">Tablet Serving</a>\n<ul>\n<li><a href=\"#write\">Write</a></li>\n<li><a href=\"#read\">Read</a></li>\n</ul>\n</li>\n<li><a href=\"#compactions\">Compactions</a>\n<ul>\n<li><a href=\"#minor-compaction\">Minor Compaction</a></li>\n<li><a href=\"#merging-compaction\">Merging Compaction</a></li>\n<li><a href=\"#major-compaction\">Major Compaction</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#refinements\">Refinements</a>\n<ul>\n<li><a href=\"#locality-group\">Locality Group</a>\n<ul>\n<li><a href=\"#eg-4\">eg.</a></li>\n</ul>\n</li>\n<li><a href=\"#compression\">Compression</a>\n<ul>\n<li><a href=\"#eg-5\">eg.</a></li>\n</ul>\n</li>\n<li><a href=\"#caching-for-read-performance-bloom-filter\">Caching for read performance &amp; Bloom Filter</a>\n<ul>\n<li><a href=\"#cache\">Cache</a></li>\n<li><a href=\"#bloom-filter\">Bloom Filter</a></li>\n</ul>\n</li>\n<li><a href=\"#commit-log-implementation\">Commit-log implementation</a></li>\n<li><a href=\"#speeding-up-tablet-recovery\">Speeding up tablet recovery</a></li>\n<li><a href=\"#exploiting-immutability\">Exploiting immutability</a></li>\n</ul>\n</li>\n<li><a href=\"#evaluation\">Evaluation</a></li>\n<li><a href=\"#conclusion\">Conclusion</a>\n<ul>\n<li><a href=\"#reference\">Reference</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-05-19 09:53:00","dateFormat":"2020-05-19"},{"fileName":"the-log-structured-merge-tree-lsm-tree","abstract":"<blockquote>\n<ul>\n<li>1996 年发表的 LSM Tree. 原文链接见参考链接【1】</li>\n</ul>\n</blockquote>\n","description":" 1996 年发表的 LSM Tree. 原文链接见参考链接【1】 作为 KV 存储中应用最为广泛的存储引擎（数据结构），近年来提出了大量新的优化方案。 此篇为考古文，了解 LSM 设计之初的一些想法以及 LSM 底层原理。 该...","title":"The Log-Structured Merge-Tree (LSM-Tree)","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"LSM","slug":"_jfuTNqah","used":true,"link":"https://blog.shunzi.tech/tag/_jfuTNqah/"},{"name":"对象存储","slug":"ZnIN9Ge-w","used":true,"link":"https://blog.shunzi.tech/tag/ZnIN9Ge-w/"}],"feature":"https://blog.shunzi.tech/post-images/the-log-structured-merge-tree-lsm-tree.png","link":"https://blog.shunzi.tech/post/the-log-structured-merge-tree-lsm-tree/","stats":{"text":"15 min read","time":840000,"words":3906,"minutes":15},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#abstract\">Abstract</a></li>\n<li><a href=\"#introduction\">Introduction</a>\n<ul>\n<li><a href=\"#the-five-minute-rule\">The five minute rule</a></li>\n</ul>\n</li>\n<li><a href=\"#design\">Design</a>\n<ul>\n<li><a href=\"#lsm-tree-%E7%9A%84%E7%BB%84%E6%88%90\">LSM Tree 的组成</a>\n<ul>\n<li><a href=\"#%E7%A3%81%E7%9B%98%E7%BB%84%E4%BB%B6\">磁盘组件</a></li>\n<li><a href=\"#%E5%86%85%E5%AD%98%E7%BB%84%E4%BB%B6\">内存组件</a></li>\n<li><a href=\"#rolling-merge\">Rolling Merge</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#how-a-two-component-lsm-tree-grows\">How a Two Component LSM-tree Grows</a>\n<ul>\n<li><a href=\"#rolling-merge-2\">Rolling Merge</a>\n<ul>\n<li><a href=\"#process\">Process</a></li>\n<li><a href=\"#others\">Others</a>\n<ul>\n<li><a href=\"#log-structured-file-systems\">Log Structured File Systems.</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#operations\">Operations</a>\n<ul>\n<li><a href=\"#query\">Query</a></li>\n<li><a href=\"#delete-update\">Delete Update</a></li>\n<li><a href=\"#%E7%9B%B8%E5%85%B3%E5%8F%82%E6%95%B0%E7%90%86%E8%AE%BA%E8%AE%A1%E7%AE%97\">相关参数理论计算</a></li>\n<li><a href=\"#%E5%B9%B6%E5%8F%91%E8%AE%BF%E9%97%AE\">并发访问</a>\n<ul>\n<li><a href=\"#%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98\">并发问题</a></li>\n<li><a href=\"#%E7%A3%81%E7%9B%98%E7%BB%84%E4%BB%B6%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98\">磁盘组件并发问题</a></li>\n<li><a href=\"#%E5%86%85%E5%AD%98%E7%BB%84%E4%BB%B6%E5%88%B0%E7%A3%81%E7%9B%98%E7%BB%84%E4%BB%B6%E7%9A%84%E5%B9%B6%E5%8F%91\">内存组件到磁盘组件的并发</a></li>\n</ul>\n</li>\n<li><a href=\"#failover\">Failover</a></li>\n</ul>\n</li>\n<li><a href=\"#summary\">Summary</a></li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\">参考链接</a></li>\n<li><a href=\"#extend\">Extend</a></li>\n</ul>\n</li>\n</ul>\n","date":"2020-05-08 09:53:00","dateFormat":"2020-05-08"},{"fileName":"distcache-provable-load-balancing-for-largescale-storage-systems-with-distributed-caching","abstract":"<blockquote>\n<ul>\n<li>FAST19 Best Paper DistCache: Provable Load Balancing for LargeScale Storage Systems with Distributed Caching</li>\n</ul>\n</blockquote>\n","description":" FAST19 Best Paper DistCache: Provable Load Balancing for LargeScale Storage Systems with Distributed Caching FAST...","title":"DistCache: Provable Load Balancing for LargeScale Storage Systems with Distributed Caching","tags":[{"name":"缓存","slug":"9msH-lUaA","used":true,"link":"https://blog.shunzi.tech/tag/9msH-lUaA/"}],"feature":"https://blog.shunzi.tech/post-images/distcache-provable-load-balancing-for-largescale-storage-systems-with-distributed-caching.png","link":"https://blog.shunzi.tech/post/distcache-provable-load-balancing-for-largescale-storage-systems-with-distributed-caching/","stats":{"text":"6 min read","time":316000,"words":1427,"minutes":6},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#abstract\">Abstract</a></li>\n<li><a href=\"#introduction\">Introduction</a><br>\n*<br>\n*<br>\n* <a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\">参考链接</a></li>\n<li><a href=\"#background\">Background</a></li>\n<li><a href=\"#design\">Design</a>\n<ul>\n<li><a href=\"#%E7%90%86%E8%AE%BA%E8%AF%81%E6%98%8E%E6%8E%A8%E5%AF%BC\">理论证明推导</a></li>\n</ul>\n</li>\n<li><a href=\"#instance\">Instance</a>\n<ul>\n<li><a href=\"#switch-based-caching\">Switch-Based Caching</a>\n<ul>\n<li><a href=\"#architecture\">Architecture</a></li>\n<li><a href=\"#component\">Component</a></li>\n<li><a href=\"#%E8%AF%BB%E6%B5%81%E7%A8%8B\">读流程</a></li>\n<li><a href=\"#%E5%86%99%E6%B5%81%E7%A8%8B\">写流程</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#evaluation\">Evaluation</a>\n<ul>\n<li><a href=\"#%E8%AF%BB%E6%80%A7%E8%83%BD\">读性能</a></li>\n<li><a href=\"#%E5%86%99%E6%80%A7%E8%83%BD\">写性能</a>\n<ul>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5-2\">参考链接</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-05-05 12:21:02","dateFormat":"2020-05-05"},{"fileName":"cpp-basic","abstract":"<blockquote>\n<ul>\n<li>项目开发需要使用 C++，曾经学过相关课程，但很久没与使用，有些遗忘。</li>\n<li>此处将和自己比较擅长的 Java 语言其中的概念进行类比，加深理解。</li>\n<li>记录重要笔记，主要是C++ 一些独有的概念和一些基础知识</li>\n<li>前半部分是 C 和 C++ 共通的部分，后半部分为面向对象的相关特性。</li>\n</ul>\n</blockquote>\n","description":" 项目开发需要使用 C++，曾经学过相关课程，但很久没与使用，有些遗忘。 此处将和自己比较擅长的 Java 语言其中的概念进行类比，加深理解。 记录重要笔记，主要是C++ 一些独有的概念和一些基础知识 前半部分是 C 和 C++ 共通的部...","title":"C++基础快速入门","tags":[{"name":"编程语言","slug":"n2w6bz87h","used":true,"link":"https://blog.shunzi.tech/tag/n2w6bz87h/"}],"feature":"https://blog.shunzi.tech/post-images/cpp-basic.jpg","link":"https://blog.shunzi.tech/post/cpp-basic/","stats":{"text":"33 min read","time":1977000,"words":7657,"minutes":33},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\">参考链接</a></li>\n<li><a href=\"#%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5\">基本概念</a>\n<ul>\n<li><a href=\"#%E6%A0%87%E5%87%86%E5%BA%93%E7%BB%84%E6%88%90\">标准库组成</a></li>\n<li><a href=\"#%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA\">环境搭建</a></li>\n<li><a href=\"#%E5%9F%BA%E6%9C%AC%E8%AF%AD%E6%B3%95\">基本语法</a></li>\n<li><a href=\"#%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B\">数据类型</a>\n<ul>\n<li><a href=\"#%E5%9F%BA%E6%9C%AC%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E4%BF%AE%E9%A5%B0%E7%AC%A6\">基本数据类型修饰符</a>\n<ul>\n<li><a href=\"#%E7%B1%BB%E5%9E%8B%E9%99%90%E5%AE%9A%E7%AC%A6\">类型限定符</a></li>\n</ul>\n</li>\n<li><a href=\"#typedef\">typedef</a></li>\n<li><a href=\"#%E6%9E%9A%E4%B8%BE%E7%B1%BB%E5%9E%8B\">枚举类型</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%8F%98%E9%87%8F\">变量</a>\n<ul>\n<li><a href=\"#%E5%A3%B0%E6%98%8E\">声明</a></li>\n<li><a href=\"#%E4%BD%9C%E7%94%A8%E5%9F%9F\">作用域</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%B8%B8%E9%87%8F\">常量</a>\n<ul>\n<li><a href=\"#%E5%AE%9A%E4%B9%89%E5%B8%B8%E9%87%8F\">定义常量</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%AD%98%E5%82%A8%E7%B1%BB\">存储类</a>\n<ul>\n<li><a href=\"#auto-c17-%E5%BC%83%E7%94%A8\">auto （C++17 弃用）</a></li>\n<li><a href=\"#register-c17-%E5%BC%83%E7%94%A8\">register （C++17 弃用）</a></li>\n<li><a href=\"#static\">static</a></li>\n<li><a href=\"#inline\">inline</a></li>\n<li><a href=\"#extern\">extern</a></li>\n<li><a href=\"#mutable\">mutable</a></li>\n<li><a href=\"#thread_local-c11\">thread_local (C++11)</a></li>\n</ul>\n</li>\n<li><a href=\"#%E8%BF%90%E7%AE%97%E7%AC%A6-%E5%92%8C-%E8%AF%AD%E5%8F%A5\">运算符 和 语句</a></li>\n<li><a href=\"#%E5%87%BD%E6%95%B0\">函数</a>\n<ul>\n<li><a href=\"#%E5%87%BD%E6%95%B0%E5%8F%82%E6%95%B0\">函数参数</a>\n<ul>\n<li><a href=\"#%E5%87%BD%E6%95%B0%E5%8F%82%E6%95%B0%E9%BB%98%E8%AE%A4%E5%80%BC\">函数参数默认值</a></li>\n</ul>\n</li>\n<li><a href=\"#lamda\">lamda</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%95%B0%E5%AD%97\">数字</a>\n<ul>\n<li><a href=\"#cmath\"><cmath></a></li>\n<li><a href=\"#%E9%9A%8F%E6%9C%BA%E6%95%B0\">随机数</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%95%B0%E7%BB%84\">数组</a></li>\n<li><a href=\"#%E5%AD%97%E7%AC%A6%E4%B8%B2\">字符串</a>\n<ul>\n<li><a href=\"#c-%E9%A3%8E%E6%A0%BC\">C 风格</a>\n<ul>\n<li><a href=\"#cstring\">cstring</a></li>\n</ul>\n</li>\n<li><a href=\"#c\">C++</a>\n<ul>\n<li><a href=\"#string\">string</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E6%8C%87%E9%92%88%E5%92%8C%E5%BC%95%E7%94%A8\">指针和引用</a></li>\n<li><a href=\"#%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4\">日期/时间</a>\n<ul>\n<li><a href=\"#%E5%AE%9E%E4%BE%8B\">实例</a></li>\n</ul>\n</li>\n<li><a href=\"#%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA\">输入/输出</a></li>\n<li><a href=\"#%E7%BB%93%E6%9E%84%E4%BD%93\">结构体</a></li>\n</ul>\n</li>\n<li><a href=\"#%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1\">面向对象</a>\n<ul>\n<li><a href=\"#%E7%B1%BB%E5%92%8C%E5%AF%B9%E8%B1%A1\">类和对象</a>\n<ul>\n<li><a href=\"#%E5%8F%8B%E5%85%83%E5%87%BD%E6%95%B0\">友元函数</a></li>\n<li><a href=\"#%E5%86%85%E8%81%94%E5%87%BD%E6%95%B0\">内联函数</a>\n<ul>\n<li><a href=\"#%E4%BD%9C%E7%94%A8\">作用</a></li>\n</ul>\n</li>\n<li><a href=\"#%E7%B1%BB%E4%B8%AD%E7%9A%84%E9%9D%99%E6%80%81%E6%88%90%E5%91%98\">类中的静态成员</a></li>\n</ul>\n</li>\n<li><a href=\"#%E7%BB%A7%E6%89%BF\">继承</a></li>\n<li><a href=\"#%E9%87%8D%E8%BD%BD-%E5%A4%9A%E6%80%81-%E6%8A%BD%E8%B1%A1-%E5%B0%81%E8%A3%85\">重载 多态 抽象 封装</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%8C%87%E9%92%88\">指针</a>\n<ul>\n<li><a href=\"#%E6%99%BA%E8%83%BD%E6%8C%87%E9%92%88\">智能指针</a>\n<ul>\n<li><a href=\"#stdunique_ptr\">std::unique_ptr</a></li>\n<li><a href=\"#stdshared_ptr\">std::shared_ptr</a></li>\n<li><a href=\"#stdweak_ptr\">std::weak_ptr</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-04-06 09:36:30","dateFormat":"2020-04-06"},{"fileName":"minio","abstract":"<blockquote>\n<ul>\n<li>开源支持 S3 协议的对象存储</li>\n<li>支持多个客户端访问，支持分布式集群部署，容器化部署</li>\n<li>考虑集成在项目中，作为后端存储进行测试</li>\n</ul>\n</blockquote>\n","description":" 开源支持 S3 协议的对象存储 支持多个客户端访问，支持分布式集群部署，容器化部署 考虑集成在项目中，作为后端存储进行测试 Introduction Features Open source Object Storage: MI...","title":"Minio","tags":[{"name":"对象存储","slug":"ZnIN9Ge-w","used":true,"link":"https://blog.shunzi.tech/tag/ZnIN9Ge-w/"}],"feature":"https://blog.shunzi.tech/post-images/minio.jpg","link":"https://blog.shunzi.tech/post/minio/","stats":{"text":"20 min read","time":1163000,"words":3494,"minutes":20},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#introduction\">Introduction</a>\n<ul>\n<li><a href=\"#features\">Features</a></li>\n<li><a href=\"#details\">Details</a></li>\n</ul>\n</li>\n<li><a href=\"#start\">Start</a>\n<ul>\n<li><a href=\"#docker\">Docker</a></li>\n<li><a href=\"#aws-s3-sdk-for-c\">AWS S3 SDK for C++</a>\n<ul>\n<li><a href=\"#prerequisite\">Prerequisite</a></li>\n<li><a href=\"#sample-code-list-buckets\">Sample Code: List Buckets</a></li>\n<li><a href=\"#ide-configuration-vs-code-remote\">IDE Configuration (VS Code Remote)</a></li>\n<li><a href=\"#cmake-env-configuration\">CMake Env Configuration</a></li>\n<li><a href=\"#build-and-run\">Build And Run</a></li>\n<li><a href=\"#sample-code-2-getput\">Sample Code 2 GET/PUT</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E5%B0%86-aws-s3-cpp-sdk-%E5%B0%81%E8%A3%85%E4%B8%BA-c-library\">将 aws-s3-cpp-sdk 封装为 C library</a>\n<ul>\n<li><a href=\"#create-cpp-class\">Create CPP Class</a><br>\n*\n<ul>\n<li><a href=\"#project-tree\">Project Tree</a></li>\n<li><a href=\"#define-header-s3utilh\">define header S3Util.h</a></li>\n<li><a href=\"#s3utilcpp\">S3Util.cpp</a></li>\n<li><a href=\"#%E6%B5%8B%E8%AF%95%E7%A8%8B%E5%BA%8F-maincpp\">测试程序 main.cpp</a></li>\n<li><a href=\"#cmake-build\">CMake build</a>\n<ul>\n<li><a href=\"#outside-cmakeliststxt\">Outside CMakeLists.txt</a></li>\n<li><a href=\"#inside-cmakeliststxt\">Inside CMakeLists.txt</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E7%BC%96%E5%86%99-wrapper\">编写 Wrapper</a><br>\n*\n<ul>\n<li><a href=\"#project-tree-2\">Project Tree</a></li>\n<li><a href=\"#define-header\">define header</a></li>\n<li><a href=\"#define-wrapper\">define wrapper</a></li>\n<li><a href=\"#%E6%B5%8B%E8%AF%95%E7%A8%8B%E5%BA%8F-maincpp-2\">测试程序 main.cpp</a></li>\n<li><a href=\"#inside-cmakeliststxt-2\">Inside CMakeLists.txt</a></li>\n<li><a href=\"#outside-cmakeliststxt-2\">Outside CMakeLists.txt</a></li>\n<li><a href=\"#%E4%BD%BF%E7%94%A8-c-%E8%AF%AD%E8%A8%80%E6%B5%8B%E8%AF%95-mainc\">使用 C 语言测试 main.c</a>\n<ul>\n<li><a href=\"#mainc\">main.c</a></li>\n<li><a href=\"#cmakeliststxt\">CMakeLists.txt</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E9%9B%86%E6%88%90-tcmu\">集成 TCMU</a>\n<ul>\n<li><a href=\"#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99\">参考资料</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-03-28 20:28:30","dateFormat":"2020-03-28"},{"fileName":"flashblox-achieving-both-performance-isolation-and-uniform-lifetime-for-virtualized-ssds","abstract":"<blockquote>\n<ul>\n<li>虚拟化课程论文分享，文章来自 FAST17</li>\n<li>SSD 虚拟化相关，顺便补一下之前 SSD 的坑</li>\n<li>主要解决云计算领域中虚拟化 SSD 设备中的隔离性问题</li>\n</ul>\n</blockquote>\n","description":" 虚拟化课程论文分享，文章来自 FAST17 SSD 虚拟化相关，顺便补一下之前 SSD 的坑 主要解决云计算领域中虚拟化 SSD 设备中的隔离性问题 预备知识 闪存 参考链接 [1] 知乎 - 老狼 - 杂说闪存一：关公战秦琼之...","title":"FlashBlox: Achieving Both Performance Isolation and Uniform Lifetime for Virtualized SSDs","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"SSD","slug":"Y_nsOD1At","used":true,"link":"https://blog.shunzi.tech/tag/Y_nsOD1At/"},{"name":"虚拟化","slug":"E2d1yYZcV8","used":true,"link":"https://blog.shunzi.tech/tag/E2d1yYZcV8/"}],"feature":"https://blog.shunzi.tech/post-images/flashblox-achieving-both-performance-isolation-and-uniform-lifetime-for-virtualized-ssds.png","link":"https://blog.shunzi.tech/post/flashblox-achieving-both-performance-isolation-and-uniform-lifetime-for-virtualized-ssds/","stats":{"text":"45 min read","time":2696000,"words":12588,"minutes":45},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#%E9%A2%84%E5%A4%87%E7%9F%A5%E8%AF%86-%E9%97%AA%E5%AD%98\">预备知识 闪存</a><br>\n*\n<ul>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\">参考链接</a></li>\n<li><a href=\"#%E7%AE%80%E5%8D%95%E6%80%BB%E7%BB%93\">简单总结</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#paper\">Paper</a>\n<ul>\n<li><a href=\"#abstract\">Abstract</a></li>\n<li><a href=\"#introduction\">Introduction</a>\n<ul>\n<li><a href=\"#%E5%AE%9E%E9%99%85%E5%B7%A5%E4%BD%9C\">实际工作</a></li>\n<li><a href=\"#%E5%85%B6%E4%BB%96\">其他</a></li>\n</ul>\n</li>\n<li><a href=\"#ssd-%E8%99%9A%E6%8B%9F%E5%8C%96-%E6%9C%BA%E9%81%87%E5%92%8C%E6%8C%91%E6%88%98\">SSD 虚拟化 - 机遇和挑战</a>\n<ul>\n<li><a href=\"#%E7%A1%AC%E4%BB%B6%E9%9A%94%E7%A6%BB-vs-%E7%A3%A8%E6%8D%9F%E5%9D%87%E8%A1%A1\">硬件隔离 VS 磨损均衡</a></li>\n<li><a href=\"#%E5%88%A9%E7%94%A8%E5%B9%B6%E8%A1%8C%E6%80%A7%E4%BF%9D%E8%AF%81%E9%9A%94%E7%A6%BB%E6%80%A7\">利用并行性保证隔离性</a></li>\n</ul>\n</li>\n<li><a href=\"#%E8%AE%BE%E8%AE%A1%E5%92%8C%E5%AE%9E%E7%8E%B0\">设计和实现</a>\n<ul>\n<li><a href=\"#%E6%9E%B6%E6%9E%84\">架构</a>\n<ul>\n<li><a href=\"#%E7%BB%84%E6%88%90\">组成</a></li>\n<li><a href=\"#%E8%AE%BE%E8%AE%A1\">设计</a></li>\n</ul>\n</li>\n<li><a href=\"#channel-%E9%9A%94%E7%A6%BB%E7%9A%84-vssd\">channel 隔离的 vSSD</a>\n<ul>\n<li><a href=\"#channel-%E7%9A%84%E5%88%86%E9%85%8D\">channel 的分配</a></li>\n<li><a href=\"#%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E7%9A%84%E6%8C%91%E6%88%98\">负载均衡的挑战</a></li>\n<li><a href=\"#%E9%80%9A%E9%81%93%E5%86%85%E7%9A%84%E7%A3%A8%E6%8D%9F%E5%9D%87%E8%A1%A1\">通道内的磨损均衡</a></li>\n<li><a href=\"#%E4%BA%A4%E6%8D%A2%E9%A2%91%E7%8E%87%E5%88%86%E6%9E%90\">交换频率分析</a></li>\n<li><a href=\"#%E8%87%AA%E9%80%82%E5%BA%94%E8%BF%81%E7%A7%BB%E6%9C%BA%E5%88%B6\">自适应迁移机制</a></li>\n</ul>\n</li>\n<li><a href=\"#die-%E9%9A%94%E7%A6%BB%E7%9A%84-vssd\">DIE 隔离的 vSSD</a></li>\n<li><a href=\"#%E8%BD%AF%E4%BB%B6%E9%9A%94%E7%A6%BB%E7%9A%84-ssd\">软件隔离的 SSD</a></li>\n<li><a href=\"#intra-channeldie-wear-leveling\">Intra Channel/Die Wear-Leveling</a>\n<ul>\n<li><a href=\"#%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E7%BA%A7%E5%88%AB%E7%9A%84%E6%97%A5%E5%BF%97\">应用程序/文件系统级别的日志</a></li>\n<li><a href=\"#%E8%AE%BE%E5%A4%87%E7%BA%A7%E7%9A%84%E6%98%A0%E5%B0%84\">设备级的映射</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%AE%9E%E7%8E%B0%E7%BB%86%E8%8A%82\">实现细节</a>\n<ul>\n<li><a href=\"#%E5%8E%9F%E5%9E%8Bssd\">原型SSD</a></li>\n<li><a href=\"#%E5%8E%9F%E5%9E%8B%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%92%8C%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F\">原型应用程序和文件系统</a></li>\n<li><a href=\"#%E8%B5%84%E6%BA%90%E5%88%86%E9%85%8D\">资源分配</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E6%B5%8B%E8%AF%95\">测试</a>\n<ul>\n<li><a href=\"#%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83\">测试环境</a></li>\n<li><a href=\"#microbenchmarks\">Microbenchmarks</a></li>\n<li><a href=\"#%E9%9A%94%E7%A6%BB%E7%BA%A7%E5%88%AB-vs-%E5%B0%BE%E5%BB%B6%E8%BF%9F\">隔离级别 VS 尾延迟</a>\n<ul>\n<li><a href=\"#%E7%A1%AC%E4%BB%B6%E9%9A%94%E7%A6%BB-vs-%E8%BD%AF%E4%BB%B6%E9%9A%94%E7%A6%BB\">硬件隔离 vs 软件隔离</a></li>\n<li><a href=\"#%E5%BB%B6%E8%BF%9F%E6%95%8F%E6%84%9F%E5%9E%8B%E5%92%8C%E5%B8%A6%E5%AE%BD%E6%95%8F%E6%84%9F%E5%9E%8B%E7%9A%84%E5%BA%94%E7%94%A8%E4%B9%8B%E9%97%B4%E7%9A%84%E5%BD%B1%E5%93%8D\">延迟敏感型和带宽敏感型的应用之间的影响</a></li>\n<li><a href=\"#%E7%A3%A8%E6%8D%9F%E5%9D%87%E8%A1%A1%E6%95%88%E7%8E%87%E5%92%8C%E5%BC%80%E9%94%80%E6%B5%8B%E8%AF%95\">磨损均衡效率和开销测试</a>\n<ul>\n<li><a href=\"#%E8%BF%81%E7%A7%BB%E5%BC%80%E9%94%80\">迁移开销</a></li>\n<li><a href=\"#%E8%BF%81%E7%A7%BB%E9%A2%91%E7%8E%87%E5%88%86%E6%9E%90%E6%B5%8B%E8%AF%95\">迁移频率分析测试</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E7%9B%B8%E5%85%B3%E5%B7%A5%E4%BD%9C\">相关工作</a></li>\n<li><a href=\"#%E7%BB%93%E8%AE%BA\">结论</a></li>\n</ul>\n</li>\n</ul>\n","date":"2020-03-20 20:54:51","dateFormat":"2020-03-20"},{"fileName":"controlled-data-migration-in-the-expansion-of-decentralized-object-based-storage-systems","abstract":"<blockquote>\n<ul>\n<li>FAST 2020 Controlled Data Migration in the Expansion of Decentralized Object-Based Storage Systems</li>\n<li>主要针对集群扩容/缩容场景的数据迁移过程进行优化</li>\n<li>基于Ceph CRUSH进行了修改，减少了增扩容过程中的数据迁移。</li>\n</ul>\n</blockquote>\n","description":" FAST 2020 Controlled Data Migration in the Expansion of Decentralized Object-Based Storage Systems 主要针对集群扩容/缩容场景的数据迁移过...","title":"Controlled Data Migration in the Expansion of Decentralized Object-Based Storage Systems","tags":[{"name":"Ceph","slug":"i2b42Y2j6","used":true,"link":"https://blog.shunzi.tech/tag/i2b42Y2j6/"}],"feature":"https://blog.shunzi.tech/post-images/controlled-data-migration-in-the-expansion-of-decentralized-object-based-storage-systems.png","link":"https://blog.shunzi.tech/post/controlled-data-migration-in-the-expansion-of-decentralized-object-based-storage-systems/","stats":{"text":"24 min read","time":1403000,"words":6417,"minutes":24},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#abstract\">Abstract</a></li>\n<li><a href=\"#introduction\">Introduction</a></li>\n<li><a href=\"#background\">Background</a>\n<ul>\n<li><a href=\"#crush\">CRUSH</a>\n<ul>\n<li><a href=\"#crush-steps\">CRUSH Steps</a></li>\n<li><a href=\"#pg-osds\">PG -&gt; OSDs</a>\n<ul>\n<li><a href=\"#1-takeroot\">1. take(root)</a></li>\n<li><a href=\"#2-select3-cabinet\">2. select(3, cabinet)</a></li>\n<li><a href=\"#3-select1-shelf\">3. select(1, shelf)</a></li>\n<li><a href=\"#4-select1-osd\">4. select(1, osd)</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#crush-%E7%BC%BA%E7%82%B9\">CRUSH 缺点</a></li>\n</ul>\n</li>\n<li><a href=\"#mapx\">MAPX</a>\n<ul>\n<li><a href=\"#%E5%8F%AF%E6%8E%A7%E6%95%B0%E6%8D%AE%E8%BF%81%E7%A7%BB%E7%9A%84%E6%89%A9%E5%AE%B9\">可控数据迁移的扩容</a>\n<ul>\n<li><a href=\"#%E6%A0%B8%E5%BF%83%E6%80%9D%E6%83%B3\">核心思想</a>\n<ul>\n<li><a href=\"#%E9%9B%86%E7%BE%A4%E5%8F%98%E5%8C%96\">集群变化</a></li>\n<li><a href=\"#%E5%AE%9E%E7%8E%B0%E6%80%9D%E8%B7%AF\">实现思路</a></li>\n</ul>\n</li>\n<li><a href=\"#%E7%AE%97%E6%B3%95%E6%B5%81%E7%A8%8B\">算法流程</a>\n<ul>\n<li><a href=\"#mapping-objects-to-pgs\">Mapping objects to PGs</a></li>\n<li><a href=\"#mapping-pgs-to-osds\">Mapping PGs to OSDs</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E6%95%B0%E6%8D%AE%E8%BF%81%E7%A7%BB%E6%8E%A7%E5%88%B6%E7%AE%A1%E7%90%86\">数据迁移控制管理</a>\n<ul>\n<li><a href=\"#pg-remapping\">PG remapping</a></li>\n<li><a href=\"#cluster-shrinking\">Cluster Shrinking</a></li>\n<li><a href=\"#layer-merging\">Layer merging</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%9C%A8-ceph-%E4%B8%AD%E5%AE%9E%E7%8E%B0-mapx\">在 CEPH 中实现 MAPX</a>\n<ul>\n<li><a href=\"#ceph-rbd\">Ceph RBD</a></li>\n<li><a href=\"#cephfs\">CephFS</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E6%B5%8B%E8%AF%95\">测试</a>\n<ul>\n<li><a href=\"#%E6%89%A9%E5%AE%B9%E8%BF%87%E7%A8%8B%E4%B8%AD%E7%9A%84-io-%E6%80%A7%E8%83%BD\">扩容过程中的 IO 性能</a></li>\n<li><a href=\"#%E8%AE%A1%E7%AE%97%E5%BC%80%E9%94%80\">计算开销</a></li>\n<li><a href=\"#%E7%BC%A9%E5%AE%B9%E8%BF%87%E7%A8%8B%E4%B8%AD%E7%9A%84-io-%E6%80%A7%E8%83%BD\">缩容过程中的 IO 性能</a></li>\n<li><a href=\"#%E5%B1%82%E7%BA%A7%E4%B9%8B%E9%97%B4%E7%9A%84%E5%90%88%E5%B9%B6\">层级之间的合并</a></li>\n</ul>\n</li>\n<li><a href=\"#related-word\">Related Word</a>\n<ul>\n<li><a href=\"#ceph-crush\">Ceph CRUSH</a></li>\n<li><a href=\"#%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1-%E8%BF%81%E7%A7%BB%E5%BC%80%E9%94%80\">负载均衡 &amp; 迁移开销</a></li>\n<li><a href=\"#%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F\">存储系统</a></li>\n</ul>\n</li>\n<li><a href=\"#conclusion\">Conclusion</a></li>\n</ul>\n</li>\n</ul>\n","date":"2020-03-06 15:45:18","dateFormat":"2020-03-06"},{"fileName":"ceph-objectstore","abstract":"<blockquote>\n<ul>\n<li>Ceph OSD 后端存储实现架构和源码分析</li>\n<li>结合 Ceph 已经实现的存储引擎，考虑实现新的后端存储</li>\n<li>理解 ObjectStore 和 Ceph IO 流的调用关系</li>\n</ul>\n</blockquote>\n","description":" Ceph OSD 后端存储实现架构和源码分析 结合 Ceph 已经实现的存储引擎，考虑实现新的后端存储 理解 ObjectStore 和 Ceph IO 流的调用关系 Review 源码目录结构 IO 流 librados...","title":"Ceph ObjectStore","tags":[{"name":"Ceph","slug":"i2b42Y2j6","used":true,"link":"https://blog.shunzi.tech/tag/i2b42Y2j6/"}],"feature":"https://blog.shunzi.tech/post-images/ceph-objectstore.jpg","link":"https://blog.shunzi.tech/post/ceph-objectstore/","stats":{"text":"51 min read","time":3000000,"words":10389,"minutes":51},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#review\">Review</a>\n<ul>\n<li><a href=\"#io-%E6%B5%81\">IO 流</a></li>\n</ul>\n</li>\n<li><a href=\"#architecture\">Architecture</a></li>\n<li><a href=\"#objectstore\">ObjectStore</a>\n<ul>\n<li><a href=\"#filestore\">FileStore</a>\n<ul>\n<li><a href=\"#%E5%86%99%E6%93%8D%E4%BD%9C\">写操作</a></li>\n<li><a href=\"#%E8%AF%BB%E6%93%8D%E4%BD%9C\">读操作</a></li>\n</ul>\n</li>\n<li><a href=\"#bluestore\">BlueStore</a>\n<ul>\n<li><a href=\"#msst17-%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE\">MSST17 测试数据</a>\n<ul>\n<li><a href=\"#%E6%B5%8B%E8%AF%95%E7%BB%93%E6%9E%9C\">测试结果</a></li>\n</ul>\n</li>\n<li><a href=\"#sosp19-%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE\">SOSP19 测试数据</a>\n<ul>\n<li><a href=\"#%E6%B5%8B%E8%AF%95%E7%BB%93%E6%9E%9C-2\">测试结果</a></li>\n</ul>\n</li>\n<li><a href=\"#%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%BF%E7%94%A8-bluestore\">为什么使用 BlueStore</a></li>\n<li><a href=\"#%E6%9E%B6%E6%9E%84\">架构</a></li>\n<li><a href=\"#bluefs-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84\">BlueFS 数据结构</a></li>\n<li><a href=\"#%E5%86%99%E6%93%8D%E4%BD%9C-2\">写操作</a></li>\n<li><a href=\"#%E8%AF%BB%E6%93%8D%E4%BD%9C-2\">读操作</a>\n<ul>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\">参考链接</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-02-25 10:21:17","dateFormat":"2020-02-25"},{"fileName":"vldbj-2018lsm-based-storage-techniques-a-survey","abstract":"<blockquote>\n<ul>\n<li>VLDBJ 2018：LSM-based storage techniques: a survey</li>\n</ul>\n</blockquote>\n","description":" VLDBJ 2018：LSM-based storage techniques: a survey 偶然的机会遇到一篇综述类型的文章，在考虑深入 LSM 的研究之前决定先阅读此篇 主要内容为 LSM 树的问题剖析相关方案的总结...","title":"VLDBJ 2018：LSM-based storage techniques: a survey","tags":[],"feature":"https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master/img/blog/1590204474(1).jpg","link":"https://blog.shunzi.tech/post/vldbj-2018lsm-based-storage-techniques-a-survey/","stats":{"text":"48 min read","time":2829000,"words":13038,"minutes":48},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#abstract\">Abstract</a></li>\n<li><a href=\"#introduction\">Introduction</a></li>\n<li><a href=\"#lsm-tree-%E5%9F%BA%E7%A1%80\">LSM Tree 基础</a>\n<ul>\n<li><a href=\"#lsm-tree-%E5%8F%91%E5%B1%95%E5%8E%86%E5%8F%B2\">LSM Tree 发展历史</a>\n<ul>\n<li><a href=\"#%E7%B4%A2%E5%BC%95%E7%BB%93%E6%9E%84%E7%9A%84%E6%9B%B4%E6%96%B0%E7%AD%96%E7%95%A5\">索引结构的更新策略</a></li>\n<li><a href=\"#%E5%BC%82%E5%9C%B0%E6%9B%B4%E6%96%B0%E9%A1%BA%E5%BA%8F%E5%86%99-%E6%80%9D%E6%83%B3%E8%B5%B7%E6%BA%90\">异地更新/顺序写 思想起源</a></li>\n<li><a href=\"#%E6%97%A5%E5%BF%97%E7%BB%93%E6%9E%84%E5%8C%96%E5%AD%98%E5%82%A8%E7%9A%84%E5%8E%86%E5%8F%B2%E9%97%AE%E9%A2%98\">日志结构化存储的历史问题</a></li>\n<li><a href=\"#lsm-%E7%9A%84%E6%8F%90%E5%87%BA\">LSM 的提出</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%A6%82%E4%BB%8A%E7%9A%84-lsm-tree\">如今的 LSM Tree</a>\n<ul>\n<li><a href=\"#%E5%9F%BA%E7%A1%80%E7%BB%93%E6%9E%84\">基础结构</a>\n<ul>\n<li><a href=\"#leveling-merge-policies\">Leveling Merge Policies</a></li>\n<li><a href=\"#tiering-merge-policy\">Tiering Merge Policy</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99\">参考资料</a></li>\n<li><a href=\"#%E4%B8%80%E4%BA%9B%E5%85%B6%E4%BB%96%E6%96%B9%E9%9D%A2%E7%9A%84%E4%BC%98%E5%8C%96%E6%96%B9%E6%A1%88\">一些其他方面的优化方案</a>\n<ul>\n<li><a href=\"#bloomfilter\">BloomFilter</a></li>\n<li><a href=\"#partitioning\">Partitioning</a></li>\n<li><a href=\"#concurrency-control-and-recovery\">Concurrency control and recovery</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E5%BC%80%E9%94%80%E5%88%86%E6%9E%90\">开销分析</a>\n<ul>\n<li><a href=\"#%E9%A2%84%E5%85%88%E5%81%87%E8%AE%BE\">预先假设</a></li>\n<li><a href=\"#%E5%86%99%E5%BC%80%E9%94%80\">写开销</a></li>\n<li><a href=\"#%E7%82%B9%E6%9F%A5%E8%AF%A2%E5%BC%80%E9%94%80\">点查询开销</a></li>\n<li><a href=\"#%E8%8C%83%E5%9B%B4%E6%9F%A5%E8%AF%A2%E5%BC%80%E9%94%80\">范围查询开销</a></li>\n<li><a href=\"#%E7%A9%BA%E9%97%B4%E6%94%BE%E5%A4%A7%E7%B3%BB%E6%95%B0\">空间放大系数</a></li>\n<li><a href=\"#%E6%80%BB%E7%BB%93\">总结</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#lsm-tree-%E7%9A%84%E4%BC%98%E5%8C%96%E6%96%B9%E6%A1%88\">LSM-Tree 的优化方案</a>\n<ul>\n<li><a href=\"#lsm-tree-%E6%94%B9%E8%BF%9B%E6%96%B9%E6%A1%88%E7%9A%84%E5%88%86%E7%B1%BB\">LSM Tree 改进方案的分类</a>\n<ul>\n<li><a href=\"#%E4%BC%98%E5%8C%96%E6%96%B9%E6%A1%88%E7%9A%84%E5%88%86%E7%B1%BB\">优化方案的分类</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%87%8F%E5%B0%8F%E5%86%99%E6%94%BE%E5%A4%A7\">减小写放大</a>\n<ul>\n<li><a href=\"#tiering\">Tiering</a></li>\n<li><a href=\"#merge-skipping\">Merge Skipping</a></li>\n<li><a href=\"#exploiting-data-skew\">Exploiting data skew</a></li>\n<li><a href=\"#%E6%80%BB%E7%BB%93-2\">总结</a></li>\n</ul>\n</li>\n<li><a href=\"#%E4%BC%98%E5%8C%96%E5%90%88%E5%B9%B6%E6%93%8D%E4%BD%9C\">优化合并操作</a>\n<ul>\n<li><a href=\"#%E6%8F%90%E5%8D%87%E5%90%88%E5%B9%B6%E6%80%A7%E8%83%BD-improving-merge-performance\">提升合并性能  Improving merge performance</a></li>\n<li><a href=\"#%E5%87%8F%E5%B0%8F%E7%BC%93%E5%86%B2%E7%BC%93%E5%AD%98%E4%B8%8D%E5%91%BD%E4%B8%AD-%E6%8F%90%E5%8D%87%E7%BC%93%E5%AD%98%E5%91%BD%E4%B8%AD%E7%8E%87\">减小缓冲缓存不命中 （提升缓存命中率）</a></li>\n<li><a href=\"#%E6%9C%80%E5%B0%8F%E5%8C%96write-stalls%E5%86%99%E5%81%9C%E9%A1%BF\">最小化Write Stalls（写停顿）</a></li>\n<li><a href=\"#%E6%80%BB%E7%BB%93-3\">总结</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%9F%BA%E4%BA%8E%E6%96%B0%E7%A1%AC%E4%BB%B6%E7%9A%84%E4%BC%98%E5%8C%96\">基于新硬件的优化</a>\n<ul>\n<li><a href=\"#%E5%A4%A7%E5%AE%B9%E9%87%8F%E5%86%85%E5%AD%98\">大容量内存</a></li>\n<li><a href=\"#%E5%A4%9A%E6%A0%B8\">多核</a></li>\n<li><a href=\"#ssdnvm\">SSD/NVM</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#evaluation\">Evaluation</a></li>\n<li><a href=\"#references\">References</a></li>\n<li><a href=\"#problems\">Problems</a></li>\n<li><a href=\"#extend\">Extend</a></li>\n</ul>\n</li>\n</ul>\n","date":"2020-02-11 08:49:21","dateFormat":"2020-02-11"},{"fileName":"fast-2017-2019","abstract":"<blockquote>\n<ul>\n<li>Paper bewtween FAST 2017 and FAST 2019</li>\n<li>To know about hot topic in storage.</li>\n<li>Will update to recent FAST.</li>\n</ul>\n</blockquote>\n","description":" Paper bewtween FAST 2017 and FAST 2019 To know about hot topic in storage. Will update to recent FAST. FAST 2019 Pe...","title":"FAST 2017-2019","tags":[{"name":"Paper","slug":"5uQUdLlSC","used":true,"link":"https://blog.shunzi.tech/tag/5uQUdLlSC/"}],"feature":"https://blog.shunzi.tech/post-images/fast-2017-2019.png","link":"https://blog.shunzi.tech/post/fast-2017-2019/","stats":{"text":"82 min read","time":4916000,"words":13110,"minutes":82},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#fast-2019\">FAST 2019</a>\n<ul>\n<li><a href=\"#persistent-memory-systems\">Persistent Memory Systems</a>\n<ul>\n<li><a href=\"#1-reaping-the-performance-of-fast-nvm-storage-with-udepot\">1. Reaping the performance of fast NVM storage with uDepot.</a>\n<ul>\n<li><a href=\"#abstract\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#2-optimizing-systems-for-byte-addressable-nvm-by-reducing-bit-flipping\">2. Optimizing Systems for Byte-Addressable NVM by Reducing Bit Flipping.</a>\n<ul>\n<li><a href=\"#abstract-2\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#3-write-optimized-dynamic-hashing-for-persistent-memory\">3. Write-Optimized Dynamic Hashing for Persistent Memory.</a>\n<ul>\n<li><a href=\"#abstract-3\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#4-software-wear-management-for-persistent-memories\">4. Software Wear Management for Persistent Memories.</a>\n<ul>\n<li><a href=\"#abstract-4\">Abstract</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#file-systems\">File Systems</a>\n<ul>\n<li><a href=\"#1-storage-gardening-using-a-virtualization-layer-for-efficient-defragmentation-in-the-wafl-file-system\">1. Storage Gardening: Using a Virtualization Layer for Efficient Defragmentation in the WAFL File System.</a>\n<ul>\n<li><a href=\"#abstract-5\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#2-pay-migration-tax-to-homeland-anchor-based-scalable-reference-counting-for-multicores\">2. Pay Migration Tax to Homeland: Anchor-based Scalable Reference Counting for Multicores.</a>\n<ul>\n<li><a href=\"#abstract-6\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#3-speculative-encryption-on-gpu-applied-to-cryptographic-file-systems\">3. Speculative Encryption on GPU Applied to Cryptographic File Systems.</a>\n<ul>\n<li><a href=\"#abstract-7\">Abstract</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#deduplication\">Deduplication</a>\n<ul>\n<li><a href=\"#1-sketching-volume-capacities-in-deduplicated-storage\">1. Sketching Volume Capacities in Deduplicated Storage.</a>\n<ul>\n<li><a href=\"#abstract-8\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#2-finesse-fine-grained-feature-locality-based-fast-resemblance-detection-for-post-deduplication-delta-compression\">2. Finesse: Fine-Grained Feature Locality based Fast Resemblance Detection for Post-Deduplication Delta Compression.</a>\n<ul>\n<li><a href=\"#abstract-9\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#3-sliding-look-back-window-assisted-data-chunk-rewriting-for-improving-deduplication-restore-performance\">3. Sliding Look-Back Window Assisted Data Chunk Rewriting for Improving Deduplication Restore Performance.</a>\n<ul>\n<li><a href=\"#abstract-10\">Abstract</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#storage-potpourri\">Storage Potpourri</a>\n<ul>\n<li><a href=\"#1-distcache-provable-load-balancing-for-large-scale-storage-systems-with-distributed-caching\">1. DistCache: Provable Load Balancing for Large-Scale Storage Systems with Distributed Caching.</a>\n<ul>\n<li><a href=\"#abstract-11\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#2-geardb-a-gc-free-key-value-store-on-hm-smr-drives-with-gear-compaction\">2. GearDB: A GC-free Key-Value Store on HM-SMR Drives with Gear Compaction.</a>\n<ul>\n<li><a href=\"#abstract-12\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#3-speicher-securing-lsm-based-key-value-stores-using-shielded-execution\">3. SPEICHER: Securing LSM-based Key-Value Stores using Shielded Execution.</a>\n<ul>\n<li><a href=\"#abstract-13\">Abstract</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#nvm-file-and-storage-systems\">NVM File and Storage Systems</a>\n<ul>\n<li><a href=\"#1-slm-db-single-level-key-value-store-with-persistent-memory\">1. SLM-DB: Single-Level Key-Value Store with Persistent Memory.</a>\n<ul>\n<li><a href=\"#abstract-14\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#2-ziggurat-a-tiered-file-system-for-non-volatile-main-memories-and-disks\">2. Ziggurat: A Tiered File System for Non-Volatile Main Memories and Disks.</a>\n<ul>\n<li><a href=\"#abstract-15\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#3-orion-a-distributed-file-system-for-non-volatile-main-memory-and-rdma-capable-networks\">3. Orion: A Distributed File System for Non-Volatile Main Memory and RDMA-Capable Networks.</a>\n<ul>\n<li><a href=\"#abstract-16\">Abstract</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#big-systems\">Big Systems</a>\n<ul>\n<li><a href=\"#1-instalytics-cluster-filesystem-co-design-for-big-data-analytics\">1. INSTalytics: Cluster Filesystem Co-design for Big-data Analytics.</a>\n<ul>\n<li><a href=\"#abstract-17\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#2-graphone-a-data-store-for-real-time-analytics-on-evolving-graphs\">2. GraphOne: A Data Store for Real-time Analytics on Evolving Graphs.</a>\n<ul>\n<li><a href=\"#abstract-18\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#3-automatic-application-aware-io-forwarding-resource-allocation\">3. Automatic, Application-Aware I/O Forwarding Resource Allocation.</a>\n<ul>\n<li><a href=\"#abstract-19\">Abstract</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#flash-and-emerging-storage-systems\">Flash and Emerging Storage Systems</a>\n<ul>\n<li><a href=\"#1-design-tradeoffs-for-ssd-reliability\">1. Design Tradeoffs for SSD Reliability.</a>\n<ul>\n<li><a href=\"#abstract-20\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#2-fully-automatic-stream-management-for-multi-streamed-ssds-using-program-contexts\">2. Fully Automatic Stream Management for Multi-Streamed SSDs Using Program Contexts.</a>\n<ul>\n<li><a href=\"#abstract-21\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#3-large-scale-graph-processing-on-emerging-storage-devices\">3. Large-Scale Graph Processing on Emerging Storage Devices.</a>\n<ul>\n<li><a href=\"#abstract-22\">Abstract</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#erasure-coding-and-reliability\">Erasure Coding and Reliability</a>\n<ul>\n<li><a href=\"#1-fast-erasure-coding-for-data-storage-a-comprehensive-study-of-the-acceleration-techniques\">1. Fast Erasure Coding for Data Storage: A Comprehensive Study of the Acceleration Techniques.</a>\n<ul>\n<li><a href=\"#abstract-23\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#2-openec-toward-unified-and-configurable-erasure-coding-management-in-distributed-storage-systems\">2. OpenEC: Toward Unified and Configurable Erasure Coding Management in Distributed Storage Systems.</a>\n<ul>\n<li><a href=\"#abstract-24\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#3-cluster-storage-systems-gotta-have-heart-improving-storage-efficiency-by-exploiting-disk-reliability-heterogeneity\">3. Cluster storage systems gotta have HeART: improving storage efficiency by exploiting disk-reliability heterogeneity.</a>\n<ul>\n<li><a href=\"#abstract-25\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#4-scalecheck-a-single-machine-approach-for-discovering-scalability-bugs-in-large-distributed-systems\">4. ScaleCheck: A Single-Machine Approach for Discovering Scalability Bugs in Large Distributed Systems.</a>\n<ul>\n<li><a href=\"#abstract-26\">Abstract</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#fast-2018\">FAST 2018</a>\n<ul>\n<li><a href=\"#failing-and-recovering\">Failing and Recovering</a>\n<ul>\n<li><a href=\"#1-fail-slow-at-scale-evidence-of-hardware-performance-faults-in-large-production-systems\">1. Fail-Slow at Scale: Evidence of Hardware Performance Faults in Large Production Systems.</a>\n<ul>\n<li><a href=\"#abstract-27\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#2-protocol-aware-recovery-for-consensus-based-storage\">2. Protocol-Aware Recovery for Consensus-Based Storage.</a>\n<ul>\n<li><a href=\"#abstract-28\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#3-wafl-iron-repairing-live-enterprise-file-systems\">3. WAFL Iron: Repairing Live Enterprise File Systems.</a>\n<ul>\n<li><a href=\"#abstract-29\">Abstract</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#revealing-flashy-secrets\">Revealing Flashy Secrets</a>\n<ul>\n<li><a href=\"#1-mqsim-a-framework-for-enabling-realistic-studies-of-modern-multi-queue-ssd-devices\">1. MQSim: A Framework for Enabling Realistic Studies of Modern Multi-Queue SSD Devices.</a>\n<ul>\n<li><a href=\"#abstract-30\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#2-pen-design-and-evaluation-of-partial-erase-for-3d-nand-based-high-density-ssds\">2. PEN: Design and Evaluation of Partial-Erase for 3D NAND-Based High Density SSDs.</a>\n<ul>\n<li><a href=\"#abstract-31\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#3-the-case-of-femu-cheap-accurate-scalable-and-extensible-flash-emulator\">3. The CASE of FEMU: Cheap, Accurate, Scalable and Extensible Flash Emulator.</a>\n<ul>\n<li><a href=\"#abstract-32\">Abstract</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#understanding-the-metadata-story\">Understanding the Meta(data) Story</a>\n<ul>\n<li><a href=\"#1-spiffy-enabling-file-system-aware-storage-applications\">1. Spiffy: Enabling File-System Aware Storage Applications.</a>\n<ul>\n<li><a href=\"#abstract-33\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#2-towards-robust-file-system-checkers\">2. Towards Robust File System Checkers.</a>\n<ul>\n<li><a href=\"#abstract-34\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#3-the-full-path-to-full-path-indexing\">3. The Full Path to Full-Path Indexing.</a>\n<ul>\n<li><a href=\"#abstract-35\">Abstract</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#coding-hashing-hiding\">Coding, Hashing, Hiding</a>\n<ul>\n<li><a href=\"#1-clay-codes-moulding-mds-codes-to-yield-an-msr-code\">1. Clay Codes: Moulding MDS Codes to Yield an MSR Code.</a>\n<ul>\n<li><a href=\"#abstract-36\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#2-towards-web-based-delta-synchronization-for-cloud-storage-services\">2. Towards Web-based Delta Synchronization for Cloud Storage Services.</a>\n<ul>\n<li><a href=\"#abstract-37\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#3-stash-in-a-flash\">3. Stash in a Flash.</a>\n<ul>\n<li><a href=\"#abstract-38\">Abstract</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#new-media-and-old\">New Media and Old</a>\n<ul>\n<li><a href=\"#1-endurable-transient-inconsistency-in-byte-addressable-persistent-b-tree\">1. Endurable Transient Inconsistency in Byte-Addressable Persistent B+-Tree.</a>\n<ul>\n<li><a href=\"#abstract-39\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#2-rflush-rethink-the-flush\">2. RFLUSH: Rethink the Flush.</a>\n<ul>\n<li><a href=\"#abstract-40\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#3-barrier-enabled-io-stack-for-flash-storage\">3. Barrier-Enabled IO Stack for Flash Storage.</a>\n<ul>\n<li><a href=\"#abstract-41\">Abstract</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#long-live-the-file-system\">Long Live the File System!</a>\n<ul>\n<li><a href=\"#1-high-performance-transaction-processing-in-journaling-file-systems\">1. High-Performance Transaction Processing in Journaling File Systems.</a>\n<ul>\n<li><a href=\"#abstract-42\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#2-designing-a-true-direct-access-file-system-with-devfs\">2. Designing a True Direct-Access File System with DevFS.</a>\n<ul>\n<li><a href=\"#abstract-43\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#3-fstream-managing-flash-streams-in-the-file-system\">3. FStream: Managing Flash Streams in the File System.</a>\n<ul>\n<li><a href=\"#abstract-44\">Abstract</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#distribute-and-conquer\">Distribute and Conquer</a>\n<ul>\n<li><a href=\"#1-improving-docker-registry-design-based-on-production-workload-analysis\">1. Improving Docker Registry Design Based on Production Workload Analysis.</a>\n<ul>\n<li><a href=\"#abstract-45\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#2-raid-deterministic-and-balanced-data-distribution-for-large-disk-enclosures\">2. RAID+: Deterministic and Balanced Data Distribution for Large Disk Enclosures.</a>\n<ul>\n<li><a href=\"#abstract-46\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#3-logical-synchronous-replication-in-the-tintri-vmstore-file-system\">3. Logical Synchronous Replication in the Tintri VMstore File System.</a>\n<ul>\n<li><a href=\"#abstract-47\">Abstract</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#dedup\">Dedup:</a>\n<ul>\n<li><a href=\"#1-alacc-accelerating-restore-performance-of-data-deduplication-systems-using-adaptive-look-ahead-window-assisted-chunk-caching\">1. ALACC: Accelerating Restore Performance of Data Deduplication Systems Using Adaptive Look-Ahead Window Assisted Chunk Caching.</a>\n<ul>\n<li><a href=\"#abstract-48\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#2-uksm-swift-memory-deduplication-via-hierarchical-and-adaptive-memory-region-distilling\">2. UKSM: Swift Memory Deduplication via Hierarchical and Adaptive Memory Region Distilling.</a>\n<ul>\n<li><a href=\"#abstract-49\">Abstract</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#fast-2017\">FAST 2017</a>\n<ul>\n<li><a href=\"#garbage\">Garbage</a>\n<ul>\n<li><a href=\"#1-algorithms-and-data-structures-for-efficient-free-space-reclamation-in-wafl\">1. Algorithms and Data Structures for Efficient Free Space Reclamation in WAFL.</a>\n<ul>\n<li><a href=\"#abstract-50\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#2-tiny-tail-flash-near-perfect-elimination-of-garbage-collection-tail-latencies-in-nand-ssds\">2. Tiny-Tail Flash: Near-Perfect Elimination of Garbage Collection Tail Latencies in NAND SSDs.</a>\n<ul>\n<li><a href=\"#abstract-51\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#3-the-logic-of-physical-garbage-collection-in-deduplicating-storage\">3. The Logic of Physical Garbage Collection in Deduplicating Storage.</a>\n<ul>\n<li><a href=\"#abstract-52\">Abstract</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#the-system\">The System</a>\n<ul>\n<li><a href=\"#1-file-systems-fated-for-senescence-nonsense-says-science\">1. File Systems Fated for Senescence? Nonsense, Says Science!</a>\n<ul>\n<li><a href=\"#abstract-53\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#2-to-fuse-or-not-to-fuse-performance-of-user-space-file-systems\">2. To FUSE or Not to FUSE: Performance of User-Space File Systems.</a>\n<ul>\n<li><a href=\"#abstract-54\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#3-knockoff-cheap-versions-in-the-cloud\">3. Knockoff: Cheap Versions in the Cloud.</a>\n<ul>\n<li><a href=\"#abstract-55\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#4-hopsfs-scaling-hierarchical-file-system-metadata-using-newsql-databases\">4. HopsFS: Scaling Hierarchical File System Metadata Using NewSQL Databases.</a>\n<ul>\n<li><a href=\"#abstract-56\">Abstract</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#edward-sharpe-and-the-magnetic-zeros\">Edward Sharpe and the Magnetic Zeros</a>\n<ul>\n<li><a href=\"#1-evolving-ext4-for-shingled-disks\">1. Evolving Ext4 for Shingled Disks.</a>\n<ul>\n<li><a href=\"#abstract-57\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#2-smart-an-approach-to-shingled-magnetic-recording-translation\">2. SMaRT: An Approach to Shingled Magnetic Recording Translation.</a>\n<ul>\n<li><a href=\"#abstract-58\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#3-facilitating-magnetic-recording-technology-scaling-for-data-center-hard-disk-drives-through-filesystem-level-transparent-local-erasure-coding\">3. Facilitating Magnetic Recording Technology Scaling for Data Center Hard Disk Drives through Filesystem-Level Transparent Local Erasure Coding.</a>\n<ul>\n<li><a href=\"#abstract-59\">Abstract</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#corruption\">Corruption</a>\n<ul>\n<li><a href=\"#1-redundancy-does-not-imply-fault-tolerance-analysis-of-distributed-storage-reactions-to-single-errors-and-corruptions\">1. Redundancy Does Not Imply Fault Tolerance: Analysis of Distributed Storage Reactions to Single Errors and Corruptions.</a>\n<ul>\n<li><a href=\"#abstract-60\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#2-omid-reloaded-scalable-and-highly-available-transaction-processing\">2. Omid, Reloaded: Scalable and Highly-Available Transaction Processing.</a>\n<ul>\n<li><a href=\"#abstract-61\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#3-application-crash-consistency-and-performance-with-ccfs\">3. Application Crash Consistency and Performance with CCFS.</a>\n<ul>\n<li><a href=\"#abstract-62\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#4-high-performance-metadata-integrity-protection-in-the-wafl-copy-on-write-file-system\">4. High Performance Metadata Integrity Protection in the WAFL Copy-on-Write File System.</a>\n<ul>\n<li><a href=\"#abstract-63\">Abstract</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#frameworks\">Frameworks</a>\n<ul>\n<li><a href=\"#1-mirador-an-active-control-plane-for-datacenter-storage\">1. Mirador: An Active Control Plane for Datacenter Storage.</a>\n<ul>\n<li><a href=\"#abstract-64\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#2-chronix-long-term-storage-and-retrieval-technology-for-anomaly-detection-in-operational-data\">2. Chronix: Long Term Storage and Retrieval Technology for Anomaly Detection in Operational Data.</a>\n<ul>\n<li><a href=\"#abstract-65\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#3-crystal-software-defined-storage-for-multi-tenant-object-stores\">3. Crystal: Software-Defined Storage for Multi-Tenant Object Stores.</a>\n<ul>\n<li><a href=\"#abstract-66\">Abstract</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#solid-state-records\">Solid State Records</a>\n<ul>\n<li><a href=\"#1-wort-write-optimal-radix-tree-for-persistent-memory-storage-systems\">1. WORT: Write Optimal Radix Tree for Persistent Memory Storage Systems.</a>\n<ul>\n<li><a href=\"#abstract-67\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#2-shrd-improving-spatial-locality-in-flash-storage-accesses-by-sequentializing-in-host-and-randomizing-in-device\">2. SHRD: Improving Spatial Locality in Flash Storage Accesses by Sequentializing in Host and Randomizing in Device.</a>\n<ul>\n<li><a href=\"#abstract-68\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#3-graphene-fine-grained-io-management-for-graph-computing\">3. Graphene: Fine-Grained IO Management for Graph Computing.</a>\n<ul>\n<li><a href=\"#abstract-69\">Abstract</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#faster-faster\">Faster Faster</a>\n<ul>\n<li><a href=\"#1-vnfs-maximizing-nfs-performance-with-compounds-and-vectorized-io\">1. vNFS: Maximizing NFS Performance with Compounds and Vectorized I/O.</a>\n<ul>\n<li><a href=\"#abstract-70\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#2-on-the-accuracy-and-scalability-of-intensive-io-workload-replay\">2. On the Accuracy and Scalability of Intensive I/O Workload Replay.</a>\n<ul>\n<li><a href=\"#abstract-71\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#3-on-the-performance-variation-in-modern-storage-stacks\">3. On the Performance Variation in Modern Storage Stacks.</a>\n<ul>\n<li><a href=\"#abstract-72\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#4-enlightening-the-io-path-a-holistic-approach-for-application-performance\">4. Enlightening the I/O Path: A Holistic Approach for Application Performance.</a>\n<ul>\n<li><a href=\"#abstract-73\">Abstract</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2020-01-09 22:18:17","dateFormat":"2020-01-09"},{"fileName":"wisckey-separating-keys-from-values-in-ssd-conscious-storage","abstract":"<blockquote>\n<ul>\n<li>文章题目：WiscKey: Separating Keys from Values in SSD-Conscious Storage。FAST 16 上的文章，该论文的延申发表在 TOS17。</li>\n</ul>\n</blockquote>\n","description":" 文章题目：WiscKey: Separating Keys from Values in SSD-Conscious Storage。FAST 16 上的文章，该论文的延申发表在 TOS17。 结合之前阅读的 SLM DB 关...","title":"WiscKey: Separating Keys from Values in SSD-Conscious Storage","tags":[{"name":"Paper","slug":"5uQUdLlSC","used":true,"link":"https://blog.shunzi.tech/tag/5uQUdLlSC/"},{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"}],"feature":"https://blog.shunzi.tech/post-images/wisckey-separating-keys-from-values-in-ssd-conscious-storage.png","link":"https://blog.shunzi.tech/post/wisckey-separating-keys-from-values-in-ssd-conscious-storage/","stats":{"text":"29 min read","time":1694000,"words":7671,"minutes":29},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#abstract\">Abstract</a></li>\n<li><a href=\"#introduction\">Introduction</a>\n<ul>\n<li><a href=\"#%E7%9B%B8%E5%85%B3%E6%A6%82%E5%BF%B5%E5%BC%95%E5%85%A5\">相关概念引入</a></li>\n<li><a href=\"#%E8%A6%81%E8%A7%A3%E5%86%B3%E7%9A%84%E9%97%AE%E9%A2%98\">要解决的问题</a></li>\n<li><a href=\"#%E6%8F%90%E5%87%BA%E7%9A%84%E6%96%B9%E6%A1%88%E7%AE%80%E4%BB%8B\">提出的方案简介</a>\n<ul>\n<li><a href=\"#%E8%A7%A3%E5%86%B3%E9%97%AE%E9%A2%98%E7%9A%84%E6%96%B9%E5%BC%8F\">解决问题的方式</a></li>\n<li><a href=\"#%E8%AF%A5%E6%96%B9%E6%A1%88%E9%9D%A2%E4%B8%B4%E7%9A%84%E6%8C%91%E6%88%98%E5%92%8C%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88\">该方案面临的挑战和解决方案</a>\n<ul>\n<li><a href=\"#%E5%88%86%E7%A6%BB-kv\">分离 KV</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E6%96%B9%E6%A1%88%E6%B5%8B%E8%AF%95%E6%95%88%E6%9E%9C%E7%AE%80%E4%BB%8B\">方案测试效果简介</a>\n<ul>\n<li><a href=\"#%E6%B5%8B%E8%AF%95%E7%BB%93%E6%9E%9C\">测试结果：</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#background\">Background</a>\n<ul>\n<li><a href=\"#lsm-tree-leveldb\">LSM Tree &amp; LevelDB</a></li>\n<li><a href=\"#%E8%AF%BB%E5%86%99%E6%94%BE%E5%A4%A7%E9%97%AE%E9%A2%98\">读写放大问题</a>\n<ul>\n<li><a href=\"#%E4%B8%BB%E8%A6%81%E5%8E%9F%E5%9B%A0\">主要原因</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%96%B0%E5%9E%8B%E5%AD%98%E5%82%A8%E5%99%A8%E4%BB%B6\">新型存储器件</a>\n<ul>\n<li><a href=\"#lsm-%E9%80%82%E7%94%A8%E4%BA%8E-ssd-%E7%9A%84%E5%8E%9F%E5%9B%A0\">LSM 适用于 SSD 的原因</a></li>\n<li><a href=\"#ssd-%E5%85%B6%E4%BB%96%E7%89%B9%E6%80%A7\">SSD 其他特性</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#wisckey\">WiscKey</a>\n<ul>\n<li><a href=\"#key-value-%E5%88%86%E7%A6%BB\">Key-Value 分离</a>\n<ul>\n<li><a href=\"#%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80\">理论基础</a></li>\n<li><a href=\"#%E6%9E%B6%E6%9E%84%E5%92%8C%E6%B5%81%E7%A8%8B\">架构和流程</a>\n<ul>\n<li><a href=\"#%E7%BB%84%E6%88%90\">组成：</a></li>\n<li><a href=\"#%E6%B5%81%E7%A8%8B\">流程</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#kv-%E5%88%86%E7%A6%BB%E5%AF%B9%E5%BA%94%E7%9A%84%E6%8C%91%E6%88%98%E5%AD%98%E5%9C%A8%E7%9A%84%E9%97%AE%E9%A2%98\">KV 分离对应的挑战（存在的问题）</a>\n<ul>\n<li><a href=\"#%E5%B9%B6%E8%A1%8C%E8%8C%83%E5%9B%B4%E6%9F%A5%E8%AF%A2-parallel-range-query\">并行范围查询 Parallel Range Query</a>\n<ul>\n<li><a href=\"#%E5%AD%98%E5%9C%A8%E7%9A%84%E9%97%AE%E9%A2%98\">存在的问题</a></li>\n<li><a href=\"#%E8%A7%A3%E5%86%B3%E6%80%9D%E8%B7%AF%E5%92%8C%E5%AE%9E%E7%8E%B0\">解决思路和实现</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6%E7%9A%84%E5%AE%9E%E7%8E%B0-garbage-collection\">垃圾回收机制的实现 Garbage Collection</a>\n<ul>\n<li><a href=\"#%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E5%AE%9E%E7%8E%B0%E6%80%9D%E8%B7%AF\">垃圾回收实现思路</a></li>\n<li><a href=\"#%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F\">实现方式</a></li>\n<li><a href=\"#%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E8%BF%87%E7%A8%8B%E4%B8%AD%E4%B8%80%E8%87%B4%E6%80%A7%E7%9A%84%E4%BF%9D%E8%AF%81\">垃圾回收过程中一致性的保证</a></li>\n<li><a href=\"#%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E7%9A%84%E6%97%B6%E6%9C%BA\">垃圾回收的时机</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%B4%A9%E6%BA%83%E4%B8%80%E8%87%B4%E6%80%A7%E7%9A%84%E4%BF%9D%E8%AF%81-crash-consistency\">崩溃一致性的保证 Crash Consistency</a>\n<ul>\n<li><a href=\"#%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B\">实现方式/处理流程</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E4%BC%98%E5%8C%96%E6%96%B9%E6%A1%88\">优化方案</a>\n<ul>\n<li><a href=\"#value-log-write-buffer\">Value-Log Write Buffer</a>\n<ul>\n<li><a href=\"#%E5%86%99\">写</a></li>\n<li><a href=\"#%E8%AF%BB\">读</a></li>\n<li><a href=\"#%E5%AD%98%E5%9C%A8%E7%9A%84%E9%97%AE%E9%A2%98-2\">存在的问题</a></li>\n</ul>\n</li>\n<li><a href=\"#%E4%BC%98%E5%8C%96-lsm-tree-log\">优化 LSM Tree Log</a>\n<ul>\n<li><a href=\"#%E6%95%85%E9%9A%9C%E6%81%A2%E5%A4%8D\">故障恢复</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E5%AE%9E%E7%8E%B0\">实现</a></li>\n</ul>\n</li>\n<li><a href=\"#evaluation\">Evaluation</a>\n<ul>\n<li><a href=\"#%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83\">测试环境</a></li>\n<li><a href=\"#microbenchmarks\">Microbenchmarks</a>\n<ul>\n<li><a href=\"#load-performance-%E5%8A%A0%E8%BD%BD%E6%80%A7%E8%83%BD\">Load Performance 加载性能</a>\n<ul>\n<li><a href=\"#%E5%9B%BE%E8%A1%A8%E8%A7%A3%E9%87%8A\">图表解释</a></li>\n<li><a href=\"#%E5%8E%9F%E5%9B%A0%E5%88%86%E6%9E%90\">原因分析</a></li>\n</ul>\n</li>\n<li><a href=\"#query-performance-%E6%9F%A5%E8%AF%A2%E6%80%A7%E8%83%BD\">Query Performance 查询性能</a>\n<ul>\n<li><a href=\"#%E5%88%86%E6%9E%90\">分析</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%85%B6%E4%BB%96%E6%B5%8B%E8%AF%95\">其他测试</a>\n<ul>\n<li><a href=\"#%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6\">垃圾回收机制</a></li>\n<li><a href=\"#%E5%B4%A9%E6%BA%83%E4%B8%80%E8%87%B4%E6%80%A7%E6%B5%8B%E8%AF%95\">崩溃一致性测试</a></li>\n<li><a href=\"#space-amplification-%E7%A9%BA%E9%97%B4%E6%94%BE%E5%A4%A7\">Space Amplification 空间放大</a></li>\n<li><a href=\"#cpu-usage-cpu-%E5%88%A9%E7%94%A8%E7%8E%87\">CPU Usage - CPU 利用率</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#ycsb-benchmarks\">YCSB Benchmarks</a></li>\n</ul>\n</li>\n<li><a href=\"#related-work\">Related Work</a>\n<ul>\n<li><a href=\"#%E5%85%B6%E4%BB%96%E6%96%B9%E6%A1%88%E4%BB%8B%E7%BB%8D\">其他方案介绍</a>\n<ul>\n<li><a href=\"#%E5%9F%BA%E4%BA%8E-hash-table-%E7%9A%84-kv-store\">基于 Hash Table 的 KV Store</a></li>\n<li><a href=\"#%E4%BC%98%E5%8C%96%E5%8E%9F%E5%A7%8B-lsm-tree-%E7%9A%84-kv-store\">优化原始 LSM Tree 的 KV Store</a></li>\n<li><a href=\"#%E5%9F%BA%E4%BA%8E%E5%85%B6%E4%BB%96%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%9A%84-kv-%E5%AD%98%E5%82%A8%E5%BC%95%E6%93%8E\">基于其他数据结构的 KV 存储引擎</a></li>\n<li><a href=\"#%E5%85%8B%E6%9C%8D%E5%86%85%E5%AD%98%E4%B8%AD%E9%94%AE%E5%80%BC%E5%AD%98%E5%82%A8%E7%9A%84%E5%8F%AF%E4%BC%B8%E7%BC%A9%E6%80%A7%E7%93%B6%E9%A2%88%E7%9A%84%E4%BC%98%E5%8C%96%E6%96%B9%E6%A1%88\">克服内存中键值存储的可伸缩性瓶颈的优化方案</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#references\">References</a></li>\n<li><a href=\"#problems\">Problems</a></li>\n<li><a href=\"#extend\">Extend</a></li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\">参考链接</a></li>\n</ul>\n</li>\n</ul>\n","date":"2019-12-20 20:39:40","dateFormat":"2019-12-20"},{"fileName":"paper-read-and-write","abstract":"<blockquote>\n<ul>\n<li>总结文献阅读和写作过程中的相关技巧</li>\n<li>根据列举的相关要点，实现文献的高效阅读</li>\n<li>写作部分还有所欠缺，还缺乏一定的实践经验</li>\n<li>...</li>\n</ul>\n</blockquote>\n","description":" 总结文献阅读和写作过程中的相关技巧 根据列举的相关要点，实现文献的高效阅读 写作部分还有所欠缺，还缺乏一定的实践经验 ... 阅读 根据文献基本都有的框架和结构来对文章内容进行梳理。 泛读则主要阅读：Abstract 摘要、In...","title":"文献阅读和写作技巧","tags":[{"name":"Paper","slug":"5uQUdLlSC","used":true,"link":"https://blog.shunzi.tech/tag/5uQUdLlSC/"},{"index":0,"name":"Ph.D","slug":"PhD","used":true,"link":"https://blog.shunzi.tech/tag/PhD/"}],"feature":"https://blog.shunzi.tech/post-images/paper-read-and-write.png","link":"https://blog.shunzi.tech/post/paper-read-and-write/","stats":{"text":"6 min read","time":333000,"words":1626,"minutes":6},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#%E9%98%85%E8%AF%BB\">阅读</a>\n<ul>\n<li><a href=\"#%E6%B3%9B%E8%AF%BB\">泛读</a>\n<ul>\n<li><a href=\"#abstract-%E6%91%98%E8%A6%81\">Abstract 摘要</a>\n<ul>\n<li><a href=\"#%E7%AC%94%E8%AE%B0%E8%A6%81%E7%82%B9\">笔记要点</a></li>\n</ul>\n</li>\n<li><a href=\"#introduction-%E5%BC%95%E8%A8%80\">Introduction 引言</a>\n<ul>\n<li><a href=\"#%E7%AC%94%E8%AE%B0%E8%A6%81%E7%82%B9-2\">笔记要点</a></li>\n<li><a href=\"#tips\">Tips</a></li>\n</ul>\n</li>\n<li><a href=\"#conclusion-%E7%BB%93%E8%AE%BA\">Conclusion 结论</a>\n<ul>\n<li><a href=\"#%E7%AC%94%E8%AE%B0%E8%A6%81%E7%82%B9-3\">笔记要点</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E7%B2%BE%E8%AF%BB\">精读</a>\n<ul>\n<li><a href=\"#background-and-motivation-%E8%83%8C%E6%99%AF\">Background and Motivation 背景</a>\n<ul>\n<li><a href=\"#%E7%AC%94%E8%AE%B0%E8%A6%81%E7%82%B9-4\">笔记要点</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%85%B7%E4%BD%93%E7%9A%84%E6%96%B9%E6%A1%88%E4%BD%9C%E4%B8%BA%E7%8B%AC%E7%AB%8B%E7%AB%A0%E8%8A%82\">具体的方案作为独立章节</a>\n<ul>\n<li><a href=\"#%E7%AC%94%E8%AE%B0%E8%A6%81%E7%82%B9-5\">笔记要点</a></li>\n</ul>\n</li>\n<li><a href=\"#evaluation-%E6%B5%8B%E8%AF%95\">Evaluation 测试</a>\n<ul>\n<li><a href=\"#%E7%AC%94%E8%AE%B0%E8%A6%81%E7%82%B9-6\">笔记要点</a></li>\n</ul>\n</li>\n<li><a href=\"#related-work-%E7%9B%B8%E5%85%B3%E5%B7%A5%E4%BD%9C\">Related work 相关工作</a></li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE\">参考文献</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E5%86%99%E4%BD%9C\">写作</a>\n<ul>\n<li><a href=\"#abstract-%E6%91%98%E8%A6%81-2\">Abstract 摘要</a></li>\n<li><a href=\"#introduction-%E5%BC%95%E8%A8%80-2\">Introduction 引言</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99\">参考资料</a></li>\n</ul>\n</li>\n</ul>\n","date":"2019-12-12 19:34:29","dateFormat":"2019-12-12"},{"fileName":"rbc-based-on-rdma","abstract":"<blockquote>\n<ul>\n<li>项目起源于分布式系统与中间件的课程作业，自己实现一个分布式系统相关的项目。</li>\n<li>由于课程内容中有大量涉及 RPC 的内容，考虑自己实现一个 RPC 的框架。</li>\n<li>现如今有很多优秀的 RPC 框架，此次主要基于 RDMA 来进行实现，参考相关论文。</li>\n<li>后续会基于 Netty 实现 RPC，顺便了解 Netty 通信框架的基础知识。</li>\n</ul>\n</blockquote>\n","description":" 项目起源于分布式系统与中间件的课程作业，自己实现一个分布式系统相关的项目。 由于课程内容中有大量涉及 RPC 的内容，考虑自己实现一个 RPC 的框架。 现如今有很多优秀的 RPC 框架，此次主要基于 RDMA 来进行实现，参考相关论文...","title":"基于RDMA的RPC实现","tags":[{"name":"分布式","slug":"geK0jEW-T","used":true,"link":"https://blog.shunzi.tech/tag/geK0jEW-T/"},{"name":"网络","slug":"ZqEqvRTvl","used":true,"link":"https://blog.shunzi.tech/tag/ZqEqvRTvl/"}],"feature":"https://blog.shunzi.tech/post-images/rbc-based-on-rdma.jpg","link":"https://blog.shunzi.tech/post/rbc-based-on-rdma/","stats":{"text":"16 min read","time":914000,"words":4133,"minutes":16},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#%E8%83%8C%E6%99%AF%E4%BB%8B%E7%BB%8D\">背景介绍</a></li>\n<li><a href=\"#%E6%83%B3%E6%B3%95\">想法</a></li>\n<li><a href=\"#%E5%89%8D%E6%8F%90%E8%83%8C%E6%99%AF%E7%9F%A5%E8%AF%86\">前提背景知识</a>\n<ul>\n<li><a href=\"#%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5\">核心概念</a>\n<ul>\n<li><a href=\"#memory-registrationmr-%E5%86%85%E5%AD%98%E6%B3%A8%E5%86%8C\">Memory Registration(MR) | 内存注册</a></li>\n<li><a href=\"#queues-%E9%98%9F%E5%88%97\">Queues | 队列</a></li>\n<li><a href=\"#rdma-%E6%94%AF%E6%8C%81%E7%9A%84%E6%93%8D%E4%BD%9C\">RDMA 支持的操作</a>\n<ul>\n<li><a href=\"#rdma-send-rdma%E5%8F%91%E9%80%81%E6%8E%A5%E6%94%B6%E6%93%8D%E4%BD%9C-sendrecv\">RDMA Send | RDMA发送(/接收)操作 （Send/Recv）</a></li>\n<li><a href=\"#rdma-read-rdma%E8%AF%BB%E6%93%8D%E4%BD%9C-pull\">RDMA Read | RDMA读操作 (Pull)</a></li>\n<li><a href=\"#rdma-write-rdma%E5%86%99%E6%93%8D%E4%BD%9C-push\">RDMA Write | RDMA写操作 (Push)</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%85%B6%E4%BB%96%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5\">其他核心概念</a>\n<ul>\n<li><a href=\"#sge\">SGE</a></li>\n<li><a href=\"#ivc_post_send%E6%8E%A5%E5%8F%A3\">ivc_post_send接口</a></li>\n<li><a href=\"#rdma-%E6%8F%90%E4%BA%A4-wr-%E6%B5%81%E7%A8%8B\">RDMA 提交 WR 流程</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#rdma-%E8%AF%AD%E4%B9%89\">RDMA 语义</a></li>\n<li><a href=\"#jverb\">jVerb</a>\n<ul>\n<li><a href=\"#svc-stateful-verb-calls\">SVC (Stateful Verb Calls)</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE\">参考文献</a></li>\n</ul>\n</li>\n</ul>\n","date":"2019-12-11 15:33:52","dateFormat":"2019-12-11"},{"fileName":"gem5-and-nvmain","abstract":"<blockquote>\n<ul>\n<li>该篇主要记录 gem5 的安装和简单使用过程</li>\n<li>计算机系统设计课程实验环境需要，部分论文的实验仿真环境为 gem5</li>\n<li>结合部分 Paper，简要介绍 gem5 主要模拟的场景和测试方法</li>\n</ul>\n</blockquote>\n","description":" 该篇主要记录 gem5 的安装和简单使用过程 计算机系统设计课程实验环境需要，部分论文的实验仿真环境为 gem5 结合部分 Paper，简要介绍 gem5 主要模拟的场景和测试方法 gem5 What is gem5? A mo...","title":"GEM5 & NVMain","tags":[{"name":"仿真","slug":"PuY19cs53","used":true,"link":"https://blog.shunzi.tech/tag/PuY19cs53/"},{"name":"系统结构","slug":"rIIc9E-ZvN","used":true,"link":"https://blog.shunzi.tech/tag/rIIc9E-ZvN/"}],"feature":"https://blog.shunzi.tech/post-images/gem5-and-nvmain.png","link":"https://blog.shunzi.tech/post/gem5-and-nvmain/","stats":{"text":"10 min read","time":579000,"words":1577,"minutes":10},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#gem5\">gem5</a>\n<ul>\n<li><a href=\"#what-is-gem5\">What is gem5?</a>\n<ul>\n<li><a href=\"#about\">About</a></li>\n</ul>\n</li>\n<li><a href=\"#install-and-test\">Install And Test</a>\n<ul>\n<li><a href=\"#install-dependencies-firstly\">Install dependencies firstly</a></li>\n<li><a href=\"#download-the-source-code\">Download the source code</a></li>\n<li><a href=\"#build-the-source-code\">Build the source code</a></li>\n<li><a href=\"#simple-test\">Simple Test</a></li>\n<li><a href=\"#check-the-output\">Check the output</a></li>\n</ul>\n</li>\n<li><a href=\"#use\">Use</a>\n<ul>\n<li><a href=\"#se-mode\">SE mode</a>\n<ul>\n<li><a href=\"#prepare\">Prepare</a></li>\n<li><a href=\"#build-and-run\">Build and Run</a></li>\n<li><a href=\"#notice\">Notice</a></li>\n</ul>\n</li>\n<li><a href=\"#fs-mode\">FS mode</a>\n<ul>\n<li><a href=\"#prepare-2\">Prepare</a></li>\n<li><a href=\"#run\">Run</a></li>\n<li><a href=\"#notice-2\">Notice</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#nvmain\">NVMain</a>\n<ul>\n<li><a href=\"#install-and-build\">Install And Build</a>\n<ul>\n<li><a href=\"#download-source\">Download Source</a></li>\n<li><a href=\"#build\">Build</a></li>\n</ul>\n</li>\n<li><a href=\"#use-2\">Use</a>\n<ul>\n<li><a href=\"#test\">Test</a></li>\n<li><a href=\"#datatype-check\">DataType Check</a>\n<ul>\n<li><a href=\"#define-4-types\">Define 4 types</a></li>\n<li><a href=\"#implementation\">Implementation</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#gem5-nvmain\">Gem5 &amp; NVMain</a>\n<ul>\n<li><a href=\"#build-2\">Build</a></li>\n<li><a href=\"#test-2\">Test</a></li>\n<li><a href=\"#parsec21\">Parsec2.1</a>\n<ul>\n<li><a href=\"#download-neccessary-dependencies\">Download neccessary dependencies</a></li>\n<li><a href=\"#use-parsec21\">Use Parsec2.1</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#references\">References</a></li>\n</ul>\n</li>\n</ul>\n","date":"2019-12-11 15:30:21","dateFormat":"2019-12-11"},{"fileName":"ceph-tiring-cache-optimization","abstract":"<blockquote>\n<ul>\n<li>主要介绍 Ceph 缓存机制涉及到的相关参数</li>\n<li>提供了一些参数的经验值参考</li>\n<li>后续针对具体的IO设计更为细致的优化方案</li>\n</ul>\n</blockquote>\n","description":" 主要介绍 Ceph 缓存机制涉及到的相关参数 提供了一些参数的经验值参考 后续针对具体的IO设计更为细致的优化方案 Ceph Tiring 调优 Ceph Tiring 功能需要仔细配置其各种参数以确保良好的性能。需要对工作负载...","title":"Ceph Tiring Cache 调优","tags":[{"name":"缓存","slug":"9msH-lUaA","used":true,"link":"https://blog.shunzi.tech/tag/9msH-lUaA/"},{"name":"Ceph","slug":"i2b42Y2j6","used":true,"link":"https://blog.shunzi.tech/tag/i2b42Y2j6/"}],"feature":"https://github.com/zjs1224522500/files-and-images/blob/master/blog/pic/project/Tier-Arch.png?raw=true","link":"https://blog.shunzi.tech/post/ceph-tiring-cache-optimization/","stats":{"text":"11 min read","time":649000,"words":2840,"minutes":11},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#ceph-tiring-%E8%B0%83%E4%BC%98\">Ceph Tiring 调优</a>\n<ul>\n<li><a href=\"#flushing-eviction\">Flushing &amp; Eviction</a><br>\n*\n<ul>\n<li><a href=\"#target_max_bytes-target_max_objects\">target_max_bytes / target_max_objects</a></li>\n<li><a href=\"#cache_target_full_ratio\">cache_target_full_ratio</a></li>\n<li><a href=\"#cache_target_dirty_ratio-cache_target_high_dirty_ratio\">cache_target_dirty_ratio / cache_target_high_dirty_ratio</a></li>\n</ul>\n</li>\n<li><a href=\"#promotions\">Promotions</a><br>\n*\n<ul>\n<li><a href=\"#hitset_count-hitset_period\">hitset_count &amp; hitset_period</a></li>\n<li><a href=\"#min_read_recency_for_promote-min_write_recency_for_promote\">min_read_recency_for_promote &amp; min_write_recency_for_promote</a></li>\n</ul>\n</li>\n<li><a href=\"#promotion-%E7%93%B6%E9%A2%88\">Promotion 瓶颈</a><br>\n*\n<ul>\n<li><a href=\"#osd_tier_promote_max_bytes_sec-osd_tier_promote_max_objects_sec\">osd_tier_promote_max_bytes_sec &amp; osd_tier_promote_max_objects_sec</a></li>\n<li><a href=\"#hit_set_grade_search_last_n\">hit_set_grade_search_last_n</a></li>\n<li><a href=\"#hit_set_grade_decay_rate\">hit_set_grade_decay_rate</a></li>\n<li><a href=\"#cache_min_flush_age-cache_min_evict_age\">cache_min_flush_age &amp; cache_min_evict_age</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2019-12-05 21:53:08","dateFormat":"2019-12-05"},{"fileName":"ceph-cache-tiering","abstract":"<blockquote>\n<ul>\n<li>主要介绍 Ceph 中的缓存机制和缓存相关实现</li>\n<li>介绍 Tiring 的相关模式并结合部分代码</li>\n<li>调研业界对于 Ceph 缓存的性能评价和优化方案</li>\n</ul>\n</blockquote>\n","description":" 主要介绍 Ceph 中的缓存机制和缓存相关实现 介绍 Tiring 的相关模式并结合部分代码 调研业界对于 Ceph 缓存的性能评价和优化方案 Cache Tiering Architecture Data Structure...","title":"Ceph Cache Tiering","tags":[{"name":"缓存","slug":"9msH-lUaA","used":true,"link":"https://blog.shunzi.tech/tag/9msH-lUaA/"},{"name":"Ceph","slug":"i2b42Y2j6","used":true,"link":"https://blog.shunzi.tech/tag/i2b42Y2j6/"}],"feature":"https://github.com/zjs1224522500/files-and-images/blob/master/blog/pic/project/Tier-Arch.png?raw=true","link":"https://blog.shunzi.tech/post/ceph-cache-tiering/","stats":{"text":"71 min read","time":4212000,"words":12968,"minutes":71},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#cache-tiering\">Cache Tiering</a>\n<ul>\n<li><a href=\"#architecture\">Architecture</a></li>\n<li><a href=\"#data-structure\">Data Structure</a></li>\n<li><a href=\"#cache-mode\">Cache Mode</a>\n<ul>\n<li><a href=\"#write-back\">Write Back</a></li>\n<li><a href=\"#read-forward\">Read Forward</a>\n<ul>\n<li><a href=\"#read-proxy\">Read Proxy</a></li>\n</ul>\n</li>\n<li><a href=\"#proxy\">Proxy</a></li>\n<li><a href=\"#forward\">Forward</a></li>\n<li><a href=\"#read-only\">Read Only</a></li>\n</ul>\n</li>\n<li><a href=\"#hitset\">HitSet</a>\n<ul>\n<li><a href=\"#explicithashhitset\">ExplicitHashHitSet</a></li>\n<li><a href=\"#explicitobjecthitset\">ExplicitObjectHitSet</a></li>\n<li><a href=\"#bloomhitset\">BloomHitSet</a></li>\n</ul>\n</li>\n<li><a href=\"#io\">IO</a>\n<ul>\n<li><a href=\"#add-cache\">Add Cache</a></li>\n<li><a href=\"#%E9%80%89%E6%8B%A9-cache-pool\">选择 Cache Pool</a></li>\n<li><a href=\"#cache-pool-%E8%AF%B7%E6%B1%82%E5%A4%84%E7%90%86\">Cache Pool 请求处理</a>\n<ul>\n<li><a href=\"#%E4%B8%BB%E6%B5%81%E7%A8%8B\">主流程</a></li>\n<li><a href=\"#agent_choose_modebool-restart-oprequestref-op\">agent_choose_mode(bool restart, OpRequestRef op)</a></li>\n<li><a href=\"#maybe_handle_cache_detail\">maybe_handle_cache_detail</a></li>\n<li><a href=\"#%E5%9B%BE%E8%A7%A3%E7%BC%93%E5%AD%98%E7%AD%96%E7%95%A5\">图解缓存策略</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#cache-flush-evict\">Cache flush &amp; evict</a>\n<ul>\n<li><a href=\"#flush\">flush</a></li>\n<li><a href=\"#evict\">evict</a>\n<ul>\n<li><a href=\"#data-structure-2\">Data Structure</a></li>\n<li><a href=\"#flushevict-%E6%89%A7%E8%A1%8C%E5%85%A5%E5%8F%A3\">flush/evict 执行入口</a></li>\n<li><a href=\"#%E7%9C%9F%E6%AD%A3%E6%89%A7%E8%A1%8C%E6%93%8D%E4%BD%9C%E7%9A%84%E6%96%B9%E6%B3%95\">真正执行操作的方法</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#command\">Command</a></li>\n</ul>\n</li>\n<li><a href=\"#references\">References</a></li>\n</ul>\n</li>\n</ul>\n","date":"2019-11-11 16:32:29","dateFormat":"2019-11-11"},{"fileName":"file-systems-unit-as-distributed-storagelessons-from-10-years-of-ceph-evolution","abstract":"<blockquote>\n<ul>\n<li>该篇文章原文是两年一届的 SOSP2019 《File Systems Unit as Distributed Storage:Lessons from 10 Years of Ceph Evolution》</li>\n</ul>\n</blockquote>\n","description":" 该篇文章原文是两年一届的 SOSP2019 《File Systems Unit as Distributed Storage:Lessons from 10 Years of Ceph Evolution》 该篇文章原文是两...","title":"File Systems Unit as Distributed Storage:Lessons from 10 Years of Ceph Evolution","tags":[{"name":"Paper","slug":"5uQUdLlSC","used":true,"link":"https://blog.shunzi.tech/tag/5uQUdLlSC/"},{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"Ceph","slug":"i2b42Y2j6","used":true,"link":"https://blog.shunzi.tech/tag/i2b42Y2j6/"}],"feature":"https://blog.shunzi.tech/post-images/file-systems-unit-as-distributed-storagelessons-from-10-years-of-ceph-evolution.jpg","link":"https://blog.shunzi.tech/post/file-systems-unit-as-distributed-storagelessons-from-10-years-of-ceph-evolution/","stats":{"text":"28 min read","time":1631000,"words":7640,"minutes":28},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#abstract\">Abstract</a></li>\n<li><a href=\"#introduction\">Introduction</a>\n<ul>\n<li><a href=\"#%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E7%9A%84%E4%BC%98%E5%8A%A3\">文件系统的优劣</a></li>\n<li><a href=\"#bluestore-%E8%AF%9E%E7%94%9F%E7%9A%84%E5%8E%9F%E5%9B%A0\">BlueStore 诞生的原因</a>\n<ul>\n<li><a href=\"#%E5%9F%BA%E4%BA%8E%E7%8E%B0%E6%9C%89%E7%9A%84%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E9%9A%BE%E4%BB%A5%E5%AE%9E%E7%8E%B0%E9%AB%98%E6%95%88%E7%9A%84%E4%BA%8B%E5%8A%A1%E6%9C%BA%E5%88%B6\">基于现有的文件系统难以实现高效的事务机制</a></li>\n<li><a href=\"#%E6%9C%AC%E5%9C%B0%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%85%83%E6%95%B0%E6%8D%AE%E6%80%A7%E8%83%BD%E5%8F%AF%E8%83%BD%E4%B8%A5%E9%87%8D%E5%BD%B1%E5%93%8D%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F%E7%9A%84%E6%95%B4%E4%BD%93%E6%80%A7%E8%83%BD\">本地文件系统的元数据性能可能严重影响分布式系统的整体性能</a></li>\n<li><a href=\"#%E6%96%B0%E5%9E%8B%E5%AD%98%E5%82%A8%E5%99%A8%E4%BB%B6%E5%90%91%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E6%8F%90%E5%87%BA%E4%BA%86%E6%8C%91%E6%88%98\">新型存储器件向文件系统提出了挑战</a></li>\n</ul>\n</li>\n<li><a href=\"#bluestore-%E7%9A%84%E6%96%B0%E7%89%B9%E6%80%A7\">BlueStore 的新特性</a></li>\n</ul>\n</li>\n<li><a href=\"#background\">Background</a>\n<ul>\n<li><a href=\"#%E5%88%86%E5%B8%83%E5%BC%8F%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E5%90%8E%E7%AB%AF%E5%AD%98%E5%82%A8%E6%A6%82%E8%A6%81\">分布式存储系统后端存储概要</a>\n<ul>\n<li><a href=\"#%E4%BA%8B%E5%8A%A1%E6%9C%BA%E5%88%B6\">事务机制</a></li>\n<li><a href=\"#%E5%85%83%E6%95%B0%E6%8D%AE%E7%AE%A1%E7%90%86\">元数据管理</a></li>\n<li><a href=\"#%E6%96%B0%E5%9E%8B%E7%A1%AC%E4%BB%B6%E7%9A%84%E6%94%AF%E6%8C%81\">新型硬件的支持</a></li>\n</ul>\n</li>\n<li><a href=\"#ceph-%E6%9E%B6%E6%9E%84\">Ceph 架构</a></li>\n<li><a href=\"#ceph-%E5%90%8E%E7%AB%AF%E5%AD%98%E5%82%A8%E7%9A%84%E6%BC%94%E5%8F%98\">Ceph 后端存储的演变</a>\n<ul>\n<li><a href=\"#filestore\">FileStore</a></li>\n<li><a href=\"#newstore\">NewStore</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#building-storage-backends-on-local-file-systems-is-hard\">Building Storage Backends on Local File Systems is Hard</a>\n<ul>\n<li><a href=\"#%E9%AB%98%E6%95%88%E7%9A%84%E4%BA%8B%E5%8A%A1%E6%9C%BA%E5%88%B6\">高效的事务机制</a>\n<ul>\n<li><a href=\"#%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E5%86%85%E9%83%A8%E7%9A%84%E4%BA%8B%E5%8A%A1%E6%9C%BA%E5%88%B6\">文件系统内部的事务机制</a></li>\n<li><a href=\"#%E7%94%A8%E6%88%B7%E6%80%81%E5%AE%9E%E7%8E%B0-wal\">用户态实现 WAL</a>\n<ul>\n<li><a href=\"#slow-read-modify-write\">Slow Read-Modify-Write</a></li>\n<li><a href=\"#non-idempotent-operations\">Non-Idempotent Operations</a></li>\n<li><a href=\"#double-writes\">Double Writes</a></li>\n</ul>\n</li>\n<li><a href=\"#%E4%BD%BF%E7%94%A8%E9%94%AE%E5%80%BC%E5%AD%98%E5%82%A8%E4%BD%9C%E4%B8%BA-wal\">使用键值存储作为 WAL</a>\n<ul>\n<li><a href=\"#%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3logical-wal%E5%AD%98%E5%9C%A8%E7%9A%84%E9%97%AE%E9%A2%98\">如何解决Logical WAL存在的问题</a></li>\n<li><a href=\"#%E9%94%AE%E5%80%BC%E5%AD%98%E5%82%A8%E5%B8%A6%E6%9D%A5%E7%9A%84%E5%BC%8A%E7%AB%AF\">键值存储带来的弊端</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E5%BF%AB%E9%80%9F%E7%9A%84%E5%85%83%E6%95%B0%E6%8D%AE%E6%93%8D%E4%BD%9C\">快速的元数据操作</a>\n<ul>\n<li><a href=\"#%E5%AD%98%E5%9C%A8%E7%9A%84%E9%97%AE%E9%A2%98\">存在的问题</a>\n<ul>\n<li><a href=\"#%E4%BB%80%E4%B9%88%E6%97%B6%E5%80%99%E8%BF%9B%E8%A1%8C%E6%9E%9A%E4%B8%BE%E6%93%8D%E4%BD%9C\">什么时候进行枚举操作</a></li>\n<li><a href=\"#%E4%B8%BA%E4%BB%80%E4%B9%88%E7%BB%93%E6%9E%9C%E6%97%A0%E5%BA%8F\">为什么结果无序</a></li>\n</ul>\n</li>\n<li><a href=\"#filestore-%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88\">FileStore 的解决方案</a>\n<ul>\n<li><a href=\"#%E6%8B%86%E5%88%86%E6%9D%A1%E7%9B%AE%E5%AD%98%E5%9C%A8%E7%9A%84%E9%97%AE%E9%A2%98\">拆分条目存在的问题</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E5%AF%B9%E6%96%B0%E5%9E%8B%E5%AD%98%E5%82%A8%E5%99%A8%E4%BB%B6%E7%9A%84%E6%94%AF%E6%8C%81\">对新型存储器件的支持</a></li>\n<li><a href=\"#%E5%85%B6%E4%BB%96%E6%8C%91%E6%88%98\">其他挑战</a>\n<ul>\n<li><a href=\"#%E9%A1%B5%E7%BC%93%E5%AD%98%E4%B8%AD%E7%9A%84-write-back-%E6%9C%BA%E5%88%B6\">页缓存中的 Write-Back 机制</a></li>\n<li><a href=\"#%E6%97%A0%E6%B3%95%E5%88%A9%E7%94%A8-cow-%E9%AB%98%E6%95%88%E5%9C%B0%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%BA%9B%E6%93%8D%E4%BD%9C\">无法利用 CoW 高效地实现一些操作</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#bluestore-%E5%85%A8%E6%96%B0%E7%9A%84%E5%90%8E%E7%AB%AF%E5%AD%98%E5%82%A8%E5%BC%95%E6%93%8E\">BlueStore - 全新的后端存储引擎</a>\n<ul>\n<li><a href=\"#architecture\">Architecture</a></li>\n<li><a href=\"#bluefs-and-rocksdb\">BlueFS and RocksDB</a>\n<ul>\n<li><a href=\"#bluefs\">BlueFS</a></li>\n<li><a href=\"#metadata-organization\">Metadata Organization</a></li>\n</ul>\n</li>\n<li><a href=\"#data-path-and-space-allocation\">Data Path and Space Allocation</a>\n<ul>\n<li><a href=\"#space-allocator\">Space Allocator</a>\n<ul>\n<li><a href=\"#freelist-manager\">FreeList Manager</a></li>\n<li><a href=\"#allocator\">Allocator</a></li>\n</ul>\n</li>\n<li><a href=\"#cache\">Cache</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#bluestore-%E5%BC%95%E5%85%A5%E7%9A%84%E6%96%B0%E7%89%B9%E6%80%A7\">BlueStore 引入的新特性</a>\n<ul>\n<li><a href=\"#%E8%8A%82%E7%9C%81%E7%A9%BA%E9%97%B4%E7%9A%84%E6%A0%A1%E9%AA%8C%E5%92%8C\">节省空间的校验和</a>\n<ul>\n<li><a href=\"#%E4%B8%BA%E4%BB%80%E4%B9%88%E9%9C%80%E8%A6%81%E6%A0%A1%E9%AA%8C%E5%92%8C\">为什么需要校验和？</a></li>\n<li><a href=\"#%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E6%A0%A1%E9%AA%8C%E5%92%8C\">文件系统校验和</a></li>\n<li><a href=\"#bluestore-%E6%A0%A1%E9%AA%8C%E5%92%8C\">BlueStore 校验和</a></li>\n</ul>\n</li>\n<li><a href=\"#%E7%BA%A0%E5%88%A0%E7%A0%81%E6%95%B0%E6%8D%AE%E7%9A%84%E8%A6%86%E7%9B%96%E5%86%99\">纠删码数据的覆盖写</a></li>\n<li><a href=\"#%E9%80%8F%E6%98%8E%E5%8E%8B%E7%BC%A9\">透明压缩</a></li>\n<li><a href=\"#%E6%96%B0%E5%9E%8B%E6%8E%A5%E5%8F%A3%E7%9A%84%E6%94%AF%E6%8C%81\">新型接口的支持</a></li>\n</ul>\n</li>\n<li><a href=\"#evaluation\">Evaluation</a>\n<ul>\n<li><a href=\"#%E5%AE%9E%E9%AA%8C%E7%8E%AF%E5%A2%83\">实验环境</a></li>\n<li><a href=\"#bare-rados-benchmark\">Bare RADOS Benchmark</a></li>\n<li><a href=\"#rados-block-device-benchmarks\">RADOS Block Device Benchmarks</a></li>\n<li><a href=\"#ec-pool-rbd\">EC Pool RBD</a></li>\n</ul>\n</li>\n<li><a href=\"#challenges-of-building-effcient-storage-backends-on-raw-storage\">Challenges of Building Effcient Storage Backends on Raw Storage</a>\n<ul>\n<li><a href=\"#%E7%BC%93%E5%AD%98%E5%A4%A7%E5%B0%8F%E7%9A%84%E8%B0%83%E6%95%B4%E5%92%8C%E5%86%99%E5%9B%9E%E7%AD%96%E7%95%A5\">缓存大小的调整和写回策略</a></li>\n<li><a href=\"#kv-%E5%AD%98%E5%82%A8%E7%9A%84%E6%95%88%E7%8E%87%E9%97%AE%E9%A2%98\">KV 存储的效率问题</a></li>\n<li><a href=\"#cpu-%E5%92%8C-%E5%86%85%E5%AD%98%E7%9A%84%E6%95%88%E7%8E%87%E9%97%AE%E9%A2%98\">CPU 和 内存的效率问题</a></li>\n</ul>\n</li>\n<li><a href=\"#extend\">Extend</a></li>\n</ul>\n</li>\n</ul>\n","date":"2019-11-07 21:37:41","dateFormat":"2019-11-07"},{"fileName":"slm-db-single-level-key-value-store-with-persistent-memory","abstract":"<blockquote>\n<ul>\n<li>FAST 2019 的文章《SLM-DB Single-Level Key-Value Store with Persistent Memory》</li>\n<li>这篇论文主要在新型存储器件Persistent Memory上针对传统的 LSM 树进行了优化。</li>\n<li>本篇论文用于课程论文阅读汇报，故在此总结便于演讲。同时学习 NVM 相关基础知识。</li>\n</ul>\n</blockquote>\n","description":" FAST 2019 的文章《SLM-DB Single-Level Key-Value Store with Persistent Memory》 这篇论文主要在新型存储器件Persistent Memory上针对传统的 LSM 树进行...","title":"SLM-DB Single-Level Key-Value Store with Persistent Memory","tags":[{"name":"Paper","slug":"5uQUdLlSC","used":true,"link":"https://blog.shunzi.tech/tag/5uQUdLlSC/"},{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"}],"feature":"https://github.com/zjs1224522500/files-and-images/blob/master/blog/pic/Arch-SLM-DB.png?raw=true","link":"https://blog.shunzi.tech/post/slm-db-single-level-key-value-store-with-persistent-memory/","stats":{"text":"17 min read","time":984000,"words":4452,"minutes":17},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#%E6%91%98%E8%A6%81\">摘要</a></li>\n<li><a href=\"#introduction\">Introduction</a>\n<ul>\n<li><a href=\"#b-tree\">B-Tree</a></li>\n<li><a href=\"#lsm-tree\">LSM Tree</a></li>\n<li><a href=\"#persistent-memory\">Persistent Memory</a></li>\n<li><a href=\"#%E4%BC%98%E5%8C%96%E6%96%B9%E5%BC%8F\">优化方式</a>\n<ul>\n<li><a href=\"#%E8%AF%BB%E4%BC%98%E5%8C%96\">读优化</a></li>\n<li><a href=\"#%E5%86%99%E4%BC%98%E5%8C%96\">写优化</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#background-motivation\">Background &amp; Motivation</a>\n<ul>\n<li><a href=\"#leveldb-introduction\">LevelDB Introduction</a>\n<ul>\n<li><a href=\"#%E7%BB%84%E6%88%90%E9%83%A8%E5%88%86\">组成部分</a></li>\n<li><a href=\"#%E6%A0%B8%E5%BF%83%E6%9C%BA%E5%88%B6\">核心机制</a>\n<ul>\n<li><a href=\"#%E5%86%99%E6%B5%81%E7%A8%8B\">写流程</a></li>\n<li><a href=\"#%E8%AF%BB%E6%B5%81%E7%A8%8B\">读流程</a></li>\n</ul>\n</li>\n<li><a href=\"#%E4%B8%80%E8%87%B4%E6%80%A7%E4%BF%9D%E8%AF%81\">一致性保证</a></li>\n<li><a href=\"#%E5%BB%B6%E7%94%B3%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\">延申参考链接</a></li>\n</ul>\n</li>\n<li><a href=\"#limitation-of-leveldb\">Limitation of LevelDB</a>\n<ul>\n<li><a href=\"#slow-read-operation\">Slow Read Operation</a></li>\n<li><a href=\"#high-write-and-read-amplification\">High write and read amplification</a>\n<ul>\n<li><a href=\"#write-amplification\">Write Amplification</a></li>\n<li><a href=\"#read-amplification\">Read Amplification</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#persistent-memory-2\">Persistent Memory</a>\n<ul>\n<li><a href=\"#%E7%89%B9%E6%80%A7\">特性</a></li>\n<li><a href=\"#%E4%B8%80%E8%87%B4%E6%80%A7%E4%BF%9D%E8%AF%81-2\">一致性保证</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%9F%BA%E4%BA%8E-lsm-%E6%A0%91%E7%9A%84%E4%BC%98%E5%8C%96\">基于 LSM 树的优化</a>\n<ul>\n<li><a href=\"#%E6%8F%90%E9%AB%98%E5%B9%B6%E8%A1%8C%E6%80%A7\">提高并行性</a></li>\n<li><a href=\"#%E5%87%8F%E5%B0%8F%E5%86%99%E6%94%BE%E5%A4%A7\">减小写放大</a></li>\n<li><a href=\"#%E5%9F%BA%E4%BA%8E%E7%A1%AC%E4%BB%B6%E7%9A%84%E4%BC%98%E5%8C%96ssd\">基于硬件的优化（SSD）</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#single-level-merge-db\">Single-Level Merge DB</a>\n<ul>\n<li><a href=\"#%E4%B8%BB%E8%A6%81%E8%B4%A1%E7%8C%AE\">主要贡献</a></li>\n<li><a href=\"#persistent-memtable\">Persistent MemTable</a>\n<ul>\n<li><a href=\"#insert\">Insert</a>\n<ul>\n<li><a href=\"#%E5%BB%B6%E7%94%B3%E9%93%BE%E6%8E%A5\">延申链接</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#b-tree-index-in-pm\">B+-Tree Index in PM</a>\n<ul>\n<li><a href=\"#when-to-build-the-tree-and-some-key-info\">When to Build the Tree And Some Key Info</a></li>\n<li><a href=\"#build-the-tree\">Build the Tree</a>\n<ul>\n<li><a href=\"#file-creation-thread\">File Creation Thread</a></li>\n<li><a href=\"#b-tree-insertion-thread\">B+ Tree insertion thread</a></li>\n<li><a href=\"#%E4%B8%80%E8%87%B4%E6%80%A7%E4%BF%9D%E8%AF%81-3\">一致性保证</a></li>\n<li><a href=\"#%E5%85%B6%E4%BB%96\">其他</a></li>\n</ul>\n</li>\n<li><a href=\"#scanning-a-b-tree\">Scanning a B+-tree</a></li>\n</ul>\n</li>\n<li><a href=\"#selective-compaction-%E9%80%89%E6%8B%A9%E6%80%A7%E5%8E%8B%E7%BC%A9\">Selective Compaction 选择性压缩</a>\n<ul>\n<li><a href=\"#why-need-compaction\">Why need Compaction?</a></li>\n<li><a href=\"#what-is-selective-compaction\">What is Selective Compaction?</a></li>\n<li><a href=\"#when-execute\">When execute?</a></li>\n<li><a href=\"#how-to-compact\">How to compact?</a></li>\n<li><a href=\"#how-to-select\">How to select?</a>\n<ul>\n<li><a href=\"#live-key-ratio-select\">Live-Key Ratio Select</a></li>\n<li><a href=\"#leaf-node-scan\">Leaf Node Scan</a></li>\n<li><a href=\"#degree-of-sequentially-per-range\">Degree of Sequentially per range</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E5%AD%98%E5%9C%A8%E7%9A%84%E9%97%AE%E9%A2%98\">存在的问题？</a>\n<ul>\n<li><a href=\"#1-b-%E6%A0%91%E7%9A%84%E5%BC%95%E5%85%A5%E5%B8%A6%E6%9D%A5%E7%9A%84%E5%86%99%E6%94%BE%E5%A4%A7%E9%97%AE%E9%A2%98%E4%BD%95%E5%A6%82\">1. B+ 树的引入带来的写放大问题何如？</a></li>\n<li><a href=\"#2-b-%E6%A0%91%E7%B4%A2%E5%BC%95%E7%BB%93%E6%9E%84%E7%9A%84%E7%BB%B4%E6%8A%A4%E7%9A%84%E4%B8%80%E8%87%B4%E6%80%A7%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81\">2. B+ 树索引结构的维护的一致性如何保证？</a></li>\n<li><a href=\"#3-%E9%92%88%E5%AF%B9%E5%A4%A7%E9%87%8F%E5%B0%8F%E5%86%99%E7%9A%84%E6%83%85%E5%86%B5b-%E6%A0%91%E6%98%AF%E5%90%A6%E4%BC%9A%E6%88%90%E4%B8%BA%E5%AF%B9%E5%BA%94%E7%9A%84%E6%80%A7%E8%83%BD%E7%93%B6%E9%A2%88\">3. 针对大量小写的情况，B+ 树是否会成为对应的性能瓶颈？</a></li>\n</ul>\n</li>\n<li><a href=\"#%E8%AE%BA%E6%96%87%E5%BB%B6%E7%94%B3\">论文延申</a>\n<ul>\n<li><a href=\"#bloom-filter-%E5%B8%83%E9%9A%86%E8%BF%87%E6%BB%A4%E5%99%A8\">Bloom Filter 布隆过滤器</a>\n<ul>\n<li><a href=\"#%E7%89%B9%E7%82%B9\">特点</a></li>\n<li><a href=\"#%E5%8E%9F%E7%90%86\">原理</a>\n<ul>\n<li><a href=\"#%E6%B7%BB%E5%8A%A0%E6%93%8D%E4%BD%9C\">添加操作</a></li>\n<li><a href=\"#%E5%88%A4%E6%96%AD%E6%93%8D%E4%BD%9C\">判断操作</a></li>\n<li><a href=\"#%E5%A6%82%E4%BD%95%E6%94%AF%E6%8C%81%E5%88%A0%E9%99%A4%E6%93%8D%E4%BD%9C%E6%98%AF%E4%B8%AA%E5%8F%AF%E4%BB%A5%E7%A0%94%E7%A9%B6%E7%9A%84%E9%97%AE%E9%A2%98\">如何支持删除操作？(是个可以研究的问题)</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%A6%82%E4%BD%95%E9%80%89%E6%8B%A9%E5%93%88%E5%B8%8C%E5%87%BD%E6%95%B0%E4%B8%AA%E6%95%B0-k-%E5%92%8C%E5%B8%83%E9%9A%86%E8%BF%87%E6%BB%A4%E5%99%A8%E9%95%BF%E5%BA%A6-m\">如何选择哈希函数个数 k 和布隆过滤器长度 m</a></li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\">参考链接</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2019-10-27 20:07:09","dateFormat":"2019-10-27"},{"fileName":"exploiting-commutativity-for-practical-fast-replication","abstract":"<blockquote>\n<ul>\n<li>NSDI 2019 的文章《Exploiting Commutativity For Practical Fast Replication》</li>\n</ul>\n</blockquote>\n","description":" NSDI 2019 的文章《Exploiting Commutativity For Practical Fast Replication》 NSDI 2019 的文章《Exploiting Commutativity For...","title":"Exploiting Commutativity For Practical Fast Replication","tags":[{"name":"Paper","slug":"5uQUdLlSC","used":true,"link":"https://blog.shunzi.tech/tag/5uQUdLlSC/"},{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"分布式","slug":"geK0jEW-T","used":true,"link":"https://blog.shunzi.tech/tag/geK0jEW-T/"}],"feature":"https://blog.shunzi.tech/post-images/exploiting-commutativity-for-practical-fast-replication.png","link":"https://blog.shunzi.tech/post/exploiting-commutativity-for-practical-fast-replication/","stats":{"text":"20 min read","time":1173000,"words":5468,"minutes":20},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#%E6%91%98%E8%A6%81\">摘要</a></li>\n<li><a href=\"#introduction\">Introduction</a>\n<ul>\n<li><a href=\"#%E8%83%8C%E6%99%AF\">背景</a></li>\n<li><a href=\"#%E7%8E%B0%E6%9C%89%E7%9A%84%E4%B8%80%E4%BA%9B%E6%96%B9%E6%A1%88\">现有的一些方案</a>\n<ul>\n<li><a href=\"#%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6-2rtt\">主从复制 - 2RTT</a></li>\n<li><a href=\"#fast-paxos-and-generalized-paxos-15rtt\">Fast Paxos and Generalized Paxos - 1.5RTT</a></li>\n<li><a href=\"#network-ordered-paxos-and-speculative-paxos-near-1rtt\">Network-Ordered Paxos and Speculative Paxos - Near 1RTT</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#curp\">CURP</a>\n<ul>\n<li><a href=\"#key-idea\">Key Idea</a></li>\n<li><a href=\"#architecture\">Architecture</a>\n<ul>\n<li><a href=\"#%E7%BB%84%E6%88%90\">组成</a></li>\n<li><a href=\"#witnesses-%E9%9B%86%E7%BE%A4\">Witnesses 集群</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%89%A7%E8%A1%8C%E6%83%85%E5%86%B5%E6%8F%8F%E8%BF%B0\">执行情况描述</a>\n<ul>\n<li><a href=\"#%E6%AD%A3%E5%B8%B8%E6%89%A7%E8%A1%8C%E5%8F%AF%E4%BA%A4%E6%8D%A2%E7%9A%84%E6%93%8D%E4%BD%9C%E6%89%A7%E8%A1%8C\">正常执行（可交换的操作执行）：</a></li>\n<li><a href=\"#%E4%B8%8E%E4%B9%8B%E5%89%8D%E7%9A%84%E6%93%8D%E4%BD%9C%E5%AD%98%E5%9C%A8%E5%86%B2%E7%AA%81%E6%97%B6%E6%89%A7%E8%A1%8C\">与之前的操作存在冲突时执行：</a></li>\n<li><a href=\"#%E8%AF%BB%E6%93%8D%E4%BD%9C%E7%9A%84%E6%89%A7%E8%A1%8C\">读操作的执行</a>\n<ul>\n<li><a href=\"#%E5%9F%BA%E4%BA%8E%E5%89%AF%E6%9C%AC%E6%95%B0%E6%8D%AE%E7%9A%84%E4%B8%80%E8%87%B4%E8%AF%BB%E5%AE%9E%E7%8E%B0\">基于副本数据的一致读实现</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%95%85%E9%9A%9C%E6%81%A2%E5%A4%8D%E6%B5%81%E7%A8%8B\">故障恢复流程</a>\n<ul>\n<li><a href=\"#primary-%E8%8A%82%E7%82%B9%E5%AE%95%E6%9C%BA\">Primary 节点宕机</a></li>\n<li><a href=\"#%E5%89%AF%E6%9C%AC%E8%8A%82%E7%82%B9%E5%AE%95%E6%9C%BA\">副本节点宕机</a></li>\n<li><a href=\"#witnesses-%E8%8A%82%E7%82%B9%E5%AE%95%E6%9C%BA\">Witnesses 节点宕机</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%95%B0%E6%8D%AE%E8%BF%81%E7%A7%BB\">数据迁移</a>\n<ul>\n<li><a href=\"#%E8%BF%81%E7%A7%BB%E7%9A%84%E6%B5%81%E7%A8%8B\">迁移的流程</a></li>\n<li><a href=\"#%E5%85%B6%E4%BB%96%E8%8A%82%E7%82%B9\">其他节点</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E6%A0%B8%E5%BF%83%E6%93%8D%E4%BD%9C%E7%9A%84%E5%AE%9E%E7%8E%B0\">核心操作的实现</a>\n<ul>\n<li><a href=\"#witnesses-%E8%8A%82%E7%82%B9%E5%A6%82%E4%BD%95%E5%88%A4%E6%96%AD%E6%93%8D%E4%BD%9C%E4%B9%8B%E9%97%B4%E6%98%AF%E5%90%A6%E6%9C%89%E5%86%B2%E7%AA%81\">Witnesses 节点如何判断操作之间是否有冲突？</a></li>\n<li><a href=\"#witnesses-%E8%8A%82%E7%82%B9%E5%9C%A8%E5%87%BA%E7%8E%B0%E6%95%B0%E6%8D%AE%E4%B8%8D%E4%B8%80%E8%87%B4%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E5%A6%82%E4%BD%95%E8%BF%9B%E8%A1%8C%E5%A4%84%E7%90%86\">Witnesses 节点在出现数据不一致的情况下如何进行处理？</a></li>\n<li><a href=\"#%E6%95%85%E9%9A%9C%E6%81%A2%E5%A4%8D%E8%BF%87%E7%A8%8B%E4%B8%AD%E5%A6%82%E4%BD%95%E9%81%BF%E5%85%8D%E6%93%8D%E4%BD%9C%E9%87%8D%E5%A4%8D%E6%89%A7%E8%A1%8C\">故障恢复过程中如何避免操作重复执行？</a></li>\n<li><a href=\"#gc-%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E7%9A%84%E6%97%B6%E6%9C%BA\">GC 垃圾回收的时机</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%9C%A8-nosql-%E4%B8%AD%E7%9A%84%E5%AE%9E%E7%8E%B0\">在 NoSQL 中的实现</a>\n<ul>\n<li><a href=\"#witness-%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E5%92%8C%E9%9C%80%E8%A6%81%E6%89%A7%E8%A1%8C%E7%9A%84%E6%93%8D%E4%BD%9C\">Witness 的生命周期和需要执行的操作</a></li>\n<li><a href=\"#witness-%E7%9A%84%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84\">Witness 的数据结构</a></li>\n<li><a href=\"#%E4%B8%BB%E8%8A%82%E7%82%B9%E4%B8%8A%E7%9A%84%E6%93%8D%E4%BD%9C%E5%8F%AF%E4%BA%A4%E6%8D%A2%E6%80%A7%E6%A3%80%E6%9F%A5%E5%86%B2%E7%AA%81%E6%A3%80%E6%B5%8B\">主节点上的操作可交换性检查（冲突检测）</a></li>\n<li><a href=\"#curp-%E6%8F%90%E9%AB%98%E4%B8%BB%E8%8A%82%E7%82%B9%E7%9A%84%E5%90%9E%E5%90%90%E9%87%8F%E6%96%B9%E5%BC%8F\">CURP 提高主节点的吞吐量方式</a>\n<ul>\n<li><a href=\"#%E8%BF%9B%E8%A1%8C%E6%89%B9%E9%87%8F%E5%90%8C%E6%AD%A5%E6%93%8D%E4%BD%9C\">进行批量同步操作</a></li>\n<li><a href=\"#%E9%9D%9E%E9%98%BB%E5%A1%9Eio\">非阻塞IO</a></li>\n</ul>\n</li>\n<li><a href=\"#gc-%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E7%9A%84%E5%AE%9E%E7%8E%B0\">GC 垃圾回收的实现</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E9%97%AE%E9%A2%98%E8%AE%A8%E8%AE%BA\">问题讨论</a>\n<ul>\n<li><a href=\"#1-%E5%8F%AF%E4%B8%8D%E5%8F%AF%E4%BB%A5%E8%AE%A9witnesses-%E8%8A%82%E7%82%B9%E5%AD%98%E5%82%A8%E5%85%A8%E9%87%8F%E7%9A%84%E6%95%B0%E6%8D%AE%E4%B8%8D%E5%8C%BA%E5%88%86%E6%93%8D%E4%BD%9C%E6%98%AF%E5%90%A6%E5%86%B2%E7%AA%81%E7%9B%B4%E6%8E%A5%E5%BC%82%E6%AD%A5%E5%9C%B0%E8%BF%9B%E8%A1%8C%E5%90%8C%E6%AD%A5\">1. 可不可以让Witnesses 节点存储全量的数据，不区分操作是否冲突，直接异步地进行同步。</a></li>\n<li><a href=\"#2-witness-%E8%8A%82%E7%82%B9%E6%98%AF%E4%BB%A5%E4%BB%80%E4%B9%88%E6%A0%B7%E7%9A%84%E5%BD%A2%E5%BC%8F%E8%AE%B0%E5%BD%95%E6%93%8D%E4%BD%9C%E7%9A%84%E4%B8%BA%E4%BD%95%E4%B8%8D%E5%90%88%E5%B9%B6%E7%9B%B8%E5%85%B3%E5%86%99%E6%93%8D%E4%BD%9C%E8%AE%B0%E5%BD%95%E6%9C%80%E7%BB%88%E7%9A%84%E5%86%99%E6%95%B0%E6%8D%AE\">2. Witness 节点是以什么样的形式记录操作的？为何不合并相关写操作，记录最终的写数据？</a></li>\n<li><a href=\"#3-%E4%BB%8E%E8%AE%BE%E8%AE%A1%E8%A7%92%E5%BA%A6%E6%9D%A5%E8%AE%B2curp%E6%96%B9%E6%A1%88%E5%BA%94%E8%AF%A5%E6%98%AF%E6%9C%89%E5%BE%88%E5%A4%A7%E7%9A%84%E5%B0%BE%E5%BB%B6%E8%BF%9F%E4%B8%BA%E4%BB%80%E4%B9%88%E6%B5%8B%E8%AF%95%E5%87%BA%E6%9D%A5%E7%9A%84%E5%B0%BE%E5%BB%B6%E8%BF%9F%E5%8F%8D%E8%80%8C%E6%9C%89%E6%8F%90%E5%8D%87\">3. 从设计角度来讲，CURP方案应该是有很大的尾延迟，为什么测试出来的尾延迟反而有提升？</a></li>\n<li><a href=\"#4-%E8%AF%BB%E8%BF%87%E7%A8%8B%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E8%BF%9B%E8%A1%8C%E4%BC%98%E5%8C%96%E7%9B%B4%E6%8E%A5%E8%AF%BB%E5%8F%96witness%E4%B8%8A%E7%9A%84%E6%95%B0%E6%8D%AE\">4. 读过程是否可以进行优化，直接读取witness上的数据？</a></li>\n<li><a href=\"#5-%E5%A4%9A%E5%B9%B6%E5%8F%91%E5%86%99%E7%9B%B8%E5%90%8C%E6%95%B0%E6%8D%AE%E6%97%B6%E7%B3%BB%E7%BB%9F%E7%9A%84%E8%BF%90%E8%A1%8C%E6%83%85%E5%86%B5\">5. 多并发写相同数据时，系统的运行情况</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2019-10-17 22:50:15","dateFormat":"2019-10-17"},{"fileName":"Docker-Notes","abstract":"<blockquote>\n<ul>\n<li>本篇博文主要是针对 Docker 相关进行一次系统地总结以及一些实战过程中的记录</li>\n<li>主要参考 Docker 官方文档，会结合一些简单的实战例子讲解部署的相关流程。</li>\n<li>后续可能针对 Docker 和 K8S 容器编排的结合进行讲解，包括一些自动化平台的集成。</li>\n</ul>\n</blockquote>\n","description":" 本篇博文主要是针对 Docker 相关进行一次系统地总结以及一些实战过程中的记录 主要参考 Docker 官方文档，会结合一些简单的实战例子讲解部署的相关流程。 后续可能针对 Docker 和 K8S 容器编排的结合进行讲解，包括一些自...","title":"重拾Docker","tags":[{"name":"服务器","slug":"fu-wu-qi","used":true,"link":"https://blog.shunzi.tech/tag/fu-wu-qi/"},{"name":"容器","slug":"X-lnqf1Ex","used":true,"link":"https://blog.shunzi.tech/tag/X-lnqf1Ex/"}],"feature":"https://github.com/zjs1224522500/files-and-images/blob/master/blog/pic/docker-k8s.png?raw=true","link":"https://blog.shunzi.tech/post/Docker-Notes/","stats":{"text":"8 min read","time":452000,"words":1267,"minutes":8},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#overview\">Overview</a>\n<ul>\n<li><a href=\"#edition\">Edition</a></li>\n<li><a href=\"#docker-engine-community\">Docker Engine - Community</a>\n<ul>\n<li><a href=\"#how-to-get-itdocker-engine-community-for-centos\">How to get it(Docker Engine - Community) for CentOS?</a>\n<ul>\n<li><a href=\"#prerequisites\">Prerequisites</a></li>\n<li><a href=\"#uninstall-old-versions\">Uninstall Old Versions</a></li>\n<li><a href=\"#install\">Install</a></li>\n</ul>\n</li>\n<li><a href=\"#how-to-get-it-for-windows-and-macos\">How to get it for Windows And MacOS?</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#get-started\">Get Started</a>\n<ul>\n<li><a href=\"#docker-concepts\">Docker Concepts</a>\n<ul>\n<li><a href=\"#images-and-containers\">Images and Containers</a></li>\n<li><a href=\"#differences-between-docker-and-vm\">Differences between Docker And VM</a></li>\n</ul>\n</li>\n<li><a href=\"#enable-k8s\">Enable K8S</a></li>\n<li><a href=\"#manage-docker-service\">Manage Docker Service</a></li>\n<li><a href=\"#container-management\">Container Management</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2019-10-16 20:32:20","dateFormat":"2019-10-16"},{"fileName":"ceph-consistency","abstract":"<blockquote>\n<ul>\n<li>Ceph 作为分布式存储系统，在可用性和一致性方面有极高的要求。</li>\n<li>Ceph 区别于其他分布式数据库等产品，更多的是作为云计算基础设施提供服务。</li>\n<li>本文主要介绍 Ceph 中的数据一致性的实现方案，以多副本为例，后续介绍纠删码。</li>\n</ul>\n</blockquote>\n","description":" Ceph 作为分布式存储系统，在可用性和一致性方面有极高的要求。 Ceph 区别于其他分布式数据库等产品，更多的是作为云计算基础设施提供服务。 本文主要介绍 Ceph 中的数据一致性的实现方案，以多副本为例，后续介绍纠删码。 Ce...","title":"Ceph中的数据一致性","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"Ceph","slug":"i2b42Y2j6","used":true,"link":"https://blog.shunzi.tech/tag/i2b42Y2j6/"},{"name":"分布式","slug":"geK0jEW-T","used":true,"link":"https://blog.shunzi.tech/tag/geK0jEW-T/"}],"feature":"https://blog.shunzi.tech/post-images/ceph-consistency.png","link":"https://blog.shunzi.tech/post/ceph-consistency/","stats":{"text":"11 min read","time":633000,"words":2909,"minutes":11},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#ceph-io\">Ceph IO</a>\n<ul>\n<li><a href=\"#rbd-io\">RBD IO</a></li>\n</ul>\n</li>\n<li><a href=\"#%E4%B8%80%E8%87%B4%E6%80%A7%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F\">一致性实现方式</a>\n<ul>\n<li><a href=\"#%E4%B8%BB%E8%A6%81%E5%88%86%E7%B1%BB\">主要分类</a></li>\n<li><a href=\"#%E5%A4%9A%E5%89%AF%E6%9C%AC%E4%B8%80%E8%87%B4%E6%80%A7%E5%8D%8F%E8%AE%AE\">多副本一致性协议</a>\n<ul>\n<li><a href=\"#%E4%B8%BB%E8%A6%81%E6%B5%81%E7%A8%8B\">主要流程</a></li>\n<li><a href=\"#%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F\">实现方式</a>\n<ul>\n<li><a href=\"#%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84\">数据结构</a></li>\n<li><a href=\"#%E5%AD%98%E5%82%A8%E6%96%B9%E5%BC%8F\">存储方式</a></li>\n<li><a href=\"#%E6%B5%81%E7%A8%8B%E7%BB%86%E5%8C%96\">流程细化</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%95%85%E9%9A%9C%E6%81%A2%E5%A4%8D\">故障恢复</a>\n<ul>\n<li><a href=\"#primary-%E6%95%85%E9%9A%9C%E6%81%A2%E5%A4%8D\">Primary 故障恢复</a></li>\n<li><a href=\"#replica-%E6%95%85%E9%9A%9C%E6%81%A2%E5%A4%8D\">Replica 故障恢复</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE\">参考文献</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2019-10-11 20:36:21","dateFormat":"2019-10-11"},{"fileName":"tail-latency","abstract":"<blockquote>\n<ul>\n<li>在相关课程以及论文阅读过程中都遇到了尾延迟问题，借此机会深入学习一下</li>\n<li>国内尾延迟资料相对较少，针对部分参考资料进行翻译搬运</li>\n<li>埋坑，看一些尾延迟相关研究和论文，未完待续。</li>\n<li>btw 针对部分论文和实验中关于尾延迟的测试进行阐述</li>\n</ul>\n</blockquote>\n","description":" 在相关课程以及论文阅读过程中都遇到了尾延迟问题，借此机会深入学习一下 国内尾延迟资料相对较少，针对部分参考资料进行翻译搬运 埋坑，看一些尾延迟相关研究和论文，未完待续。 btw 针对部分论文和实验中关于尾延迟的测试进行阐述 Pre...","title":"Tail Latency","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"网络","slug":"ZqEqvRTvl","used":true,"link":"https://blog.shunzi.tech/tag/ZqEqvRTvl/"}],"feature":"https://blog.shunzi.tech/post-images/tail-latency.jpeg","link":"https://blog.shunzi.tech/post/tail-latency/","stats":{"text":"7 min read","time":400000,"words":1940,"minutes":7},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#preventing-long-tail-latency%E8%AF%91\">Preventing Long Tail Latency（译）</a>\n<ul>\n<li><a href=\"#%E5%BC%95%E8%A8%80\">引言</a></li>\n<li><a href=\"#%E4%BB%80%E4%B9%88%E6%98%AF%E9%95%BF%E5%B0%BE%E5%BB%B6%E8%BF%9F%E4%BB%A5%E5%8F%8A%E6%98%AF%E4%BB%80%E4%B9%88%E5%8E%9F%E5%9B%A0%E5%AF%BC%E8%87%B4%E4%BA%86%E9%95%BF%E5%B0%BE%E5%BB%B6%E8%BF%9F\">什么是长尾延迟？以及是什么原因导致了长尾延迟？</a></li>\n<li><a href=\"#%E9%95%BF%E5%B0%BE%E5%BB%B6%E8%BF%9F%E7%9A%84%E5%BD%B1%E5%93%8D\">长尾延迟的影响</a></li>\n<li><a href=\"#%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E9%95%BF%E5%BB%B6%E8%BF%9F\">如何解决长延迟？</a></li>\n<li><a href=\"#%E6%9B%B4%E9%AB%98%E5%B1%82%E6%AC%A1%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88\">更高层次的解决方案</a></li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE\">参考文献</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2019-10-11 20:28:08","dateFormat":"2019-10-11"},{"fileName":"distributed-system-consistency","abstract":"<blockquote>\n<ul>\n<li>源于分布式存储系统中对一致性的严格要求，该篇针对 CAP 理论中的一致性做简单总结。</li>\n</ul>\n</blockquote>\n","description":" 源于分布式存储系统中对一致性的严格要求，该篇针对 CAP 理论中的一致性做简单总结。 源于分布式存储系统中对一致性的严格要求，该篇针对 CAP 理论中的一致性做简单总结。 结合行业中为了保证一致性所采用的方案进行实例讲解，诸如...","title":"分布式系统中的一致性","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"分布式","slug":"geK0jEW-T","used":true,"link":"https://blog.shunzi.tech/tag/geK0jEW-T/"},{"name":"数据库","slug":"shu-ju-ku","used":true,"link":"https://blog.shunzi.tech/tag/shu-ju-ku/"}],"feature":"https://blog.shunzi.tech/post-images/distributed-system-consistency.png","link":"https://blog.shunzi.tech/post/distributed-system-consistency/","stats":{"text":"27 min read","time":1572000,"words":7644,"minutes":27},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#%E4%B8%80%E8%87%B4%E6%80%A7%E9%97%AE%E9%A2%98%E5%89%8D%E6%83%85%E6%8F%90%E8%A6%81\">一致性问题前情提要</a>\n<ul>\n<li><a href=\"#%E5%B9%B6%E5%8F%91%E6%80%A7%E5%92%8C%E4%B8%80%E8%87%B4%E6%80%A7\">并发性和一致性</a>\n<ul>\n<li><a href=\"#%E5%B9%B6%E5%8F%91%E6%97%B6%E5%BA%8F\">并发时序</a>\n<ul>\n<li><a href=\"#lamport%E9%80%BB%E8%BE%91%E6%97%B6%E9%92%9F\">Lamport逻辑时钟</a></li>\n<li><a href=\"#%E5%90%91%E9%87%8F%E6%97%B6%E9%92%9F\">向量时钟</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E4%BB%80%E4%B9%88%E6%98%AF%E4%B8%80%E8%87%B4%E6%80%A7%E9%97%AE%E9%A2%98\">什么是一致性问题</a></li>\n<li><a href=\"#%E4%BA%A7%E7%94%9F%E4%B8%80%E8%87%B4%E6%80%A7%E9%97%AE%E9%A2%98%E7%9A%84%E5%8E%9F%E5%9B%A0\">产生一致性问题的原因</a>\n<ul>\n<li><a href=\"#%E7%B3%BB%E7%BB%9F%E5%B1%82%E9%9D%A2%E7%9A%84%E5%8E%9F%E5%9B%A0%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%BC%95%E5%85%A5\">系统层面的原因：分布式系统的引入</a></li>\n<li><a href=\"#%E6%A0%B9%E6%9C%AC%E5%8E%9F%E5%9B%A0\">根本原因</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E4%B8%80%E8%87%B4%E6%80%A7%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5\">一致性基本概念</a>\n<ul>\n<li><a href=\"#%E5%AE%9A%E4%B9%89\">定义</a></li>\n<li><a href=\"#%E5%88%86%E7%B1%BB\">分类</a></li>\n<li><a href=\"#%E5%BC%BA%E4%B8%80%E8%87%B4%E6%80%A7%E6%A8%A1%E5%9E%8B\">强一致性（模型）</a>\n<ul>\n<li><a href=\"#%E7%BA%BF%E6%80%A7%E4%B8%80%E8%87%B4%E6%80%A7%E6%A8%A1%E5%9E%8Blinearizability-consistency\">线性一致性（模型）Linearizability Consistency</a>\n<ul>\n<li><a href=\"#%E5%85%B7%E4%BD%93%E8%A6%81%E6%B1%82\">具体要求</a></li>\n</ul>\n</li>\n<li><a href=\"#%E9%A1%BA%E5%BA%8F%E4%B8%80%E8%87%B4%E6%80%A7%E6%A8%A1%E5%9E%8Bsequential-consistency\">顺序一致性（模型）Sequential Consistency</a>\n<ul>\n<li><a href=\"#%E5%85%B7%E4%BD%93%E8%A6%81%E6%B1%82-2\">具体要求</a></li>\n</ul>\n</li>\n<li><a href=\"#%E7%BA%BF%E6%80%A7%E4%B8%80%E8%87%B4%E6%80%A7%E5%92%8C%E9%A1%BA%E5%BA%8F%E4%B8%80%E8%87%B4%E6%80%A7%E7%9A%84%E5%AF%B9%E6%AF%94\">线性一致性和顺序一致性的对比</a>\n<ul>\n<li><a href=\"#%E7%9B%B8%E5%90%8C%E7%82%B9\">相同点</a></li>\n<li><a href=\"#%E4%B8%8D%E5%90%8C%E7%82%B9\">不同点</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E5%BC%B1%E4%B8%80%E8%87%B4%E6%80%A7%E6%A8%A1%E5%9E%8B\">弱一致性（模型）</a>\n<ul>\n<li><a href=\"#%E5%9B%A0%E6%9E%9C%E4%B8%80%E8%87%B4%E6%80%A7-causal-consistency\">因果一致性 Causal Consistency</a>\n<ul>\n<li><a href=\"#%E5%85%B7%E4%BD%93%E8%A6%81%E6%B1%82-3\">具体要求</a></li>\n<li><a href=\"#%E4%B8%8E%E9%A1%BA%E5%BA%8F%E4%B8%80%E8%87%B4%E6%80%A7%E7%9A%84%E5%8C%BA%E5%88%AB\">与顺序一致性的区别</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%9C%80%E7%BB%88%E4%B8%80%E8%87%B4%E6%80%A7-eventual-consistency\">最终一致性 Eventual Consistency</a>\n<ul>\n<li><a href=\"#%E5%85%B7%E4%BD%93%E8%A6%81%E6%B1%82-4\">具体要求</a></li>\n</ul>\n</li>\n<li><a href=\"#%E4%BB%A5%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%B8%BA%E4%B8%AD%E5%BF%83%E7%9A%84%E4%B8%80%E8%87%B4%E6%80%A7-client-centric-consistency\">以客户端为中心的一致性 Client-centric Consistency</a>\n<ul>\n<li><a href=\"#%E5%8D%95%E8%B0%83%E8%AF%BB%E4%B8%80%E8%87%B4%E6%80%A7monotonic-read-consistency\">单调读一致性（Monotonic-read Consistency）</a></li>\n<li><a href=\"#%E5%8D%95%E8%B0%83%E5%86%99%E4%B8%80%E8%87%B4%E6%80%A7monotonic-write-consistency\">单调写一致性（Monotonic-write Consistency）</a></li>\n<li><a href=\"#%E8%AF%BB%E5%86%99%E4%B8%80%E8%87%B4%E6%80%A7read-your-writes-consistency\">读写一致性（Read-your-writes Consistency）</a></li>\n<li><a href=\"#%E5%86%99%E8%AF%BB%E4%B8%80%E8%87%B4%E6%80%A7writes-follow-reads-consistency\">写读一致性（Writes-follow-reads Consistency）</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E4%B8%80%E8%87%B4%E6%80%A7%E7%9A%84%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F\">一致性的实现方式</a>\n<ul>\n<li><a href=\"#%E5%9F%BA%E6%9C%AC%E5%AE%9E%E7%8E%B0%E6%80%9D%E8%B7%AF\">基本实现思路</a>\n<ul>\n<li><a href=\"#%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1%E7%9A%84%E4%B8%80%E8%87%B4%E6%80%A7\">分布式事务的一致性</a></li>\n<li><a href=\"#%E5%BC%BA%E4%B8%80%E8%87%B4%E6%80%A7\">强一致性</a>\n<ul>\n<li><a href=\"#%E4%B8%BB%E4%BB%8E%E5%90%8C%E6%AD%A5%E5%A4%8D%E5%88%B6\">主从同步复制</a></li>\n<li><a href=\"#%E5%A4%9A%E6%95%B0%E6%B4%BE\">多数派</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%9C%80%E7%BB%88%E4%B8%80%E8%87%B4%E6%80%A7\">最终一致性</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%88%86%E5%B8%83%E5%BC%8F%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E4%B8%AD%E7%9A%84%E5%AE%9E%E7%8E%B0\">分布式存储系统中的实现</a>\n<ul>\n<li><a href=\"#azure-cosmos-db\">Azure Cosmos DB</a>\n<ul>\n<li><a href=\"#%E4%B8%80%E8%87%B4%E6%80%A7%E7%BA%A7%E5%88%AB\">一致性级别</a></li>\n</ul>\n</li>\n<li><a href=\"#cassandra\">Cassandra</a>\n<ul>\n<li><a href=\"#%E5%86%99%E6%93%8D%E4%BD%9C%E9%85%8D%E7%BD%AE\">写操作配置</a></li>\n<li><a href=\"#%E8%AF%BB%E6%93%8D%E4%BD%9C%E9%85%8D%E7%BD%AE\">读操作配置</a></li>\n<li><a href=\"#%E7%B3%BB%E7%BB%9F%E4%B8%80%E8%87%B4%E6%80%A7%E7%BA%A7%E5%88%AB\">系统一致性级别</a></li>\n</ul>\n</li>\n<li><a href=\"#oceanbase\">OceanBase</a>\n<ul>\n<li><a href=\"#%E4%B8%80%E8%87%B4%E6%80%A7%E7%BA%A7%E5%88%AB-2\">一致性级别</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\">参考链接</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2019-10-03 13:13:54","dateFormat":"2019-10-03"},{"fileName":"ceph-rbd-src","abstract":"<blockquote>\n<ul>\n<li>RBD 是 Ceph 分布式存储系统中提供的块存储服务</li>\n<li>该篇主要针对 RBD 中的整体架构以及 IO 流程进行介绍</li>\n<li>针对 librbd 中提供的接口进行简单介绍，后续将在此基础上进行实战</li>\n</ul>\n</blockquote>\n","description":" RBD 是 Ceph 分布式存储系统中提供的块存储服务 该篇主要针对 RBD 中的整体架构以及 IO 流程进行介绍 针对 librbd 中提供的接口进行简单介绍，后续将在此基础上进行实战 Ceph RBD RBD：RADOS B...","title":"Ceph-RBD 源码阅读","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"分布式","slug":"geK0jEW-T","used":true,"link":"https://blog.shunzi.tech/tag/geK0jEW-T/"}],"feature":"https://blog.shunzi.tech/post-images/ceph-rbd-src.jpg","link":"https://blog.shunzi.tech/post/ceph-rbd-src/","stats":{"text":"47 min read","time":2766000,"words":8741,"minutes":47},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#ceph-rbd\">Ceph RBD</a>\n<ul>\n<li><a href=\"#%E6%95%B4%E4%BD%93%E4%BB%8B%E7%BB%8D\">整体介绍</a></li>\n<li><a href=\"#rbd-io-%E6%B5%81\">RBD IO 流</a>\n<ul>\n<li><a href=\"#%E5%87%A0%E4%B8%AA%E9%87%8D%E8%A6%81%E7%9A%84%E5%AD%98%E5%82%A8%E7%BB%84%E7%BB%87\">几个重要的存储组织</a></li>\n<li><a href=\"#io-%E6%B5%81%E7%A8%8B\">IO 流程</a></li>\n<li><a href=\"#rbd-io-%E6%A1%86%E6%9E%B6\">RBD IO 框架</a>\n<ul>\n<li><a href=\"#%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%86%99%E6%95%B0%E6%8D%AEosd%E8%BF%87%E7%A8%8B\">客户端写数据osd过程：</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#librbd\">librbd</a>\n<ul>\n<li><a href=\"#%E6%A8%A1%E5%9D%97%E4%BB%8B%E7%BB%8D\">模块介绍</a></li>\n<li><a href=\"#librbd-%E8%AF%A6%E7%BB%86%E4%BB%8B%E7%BB%8D\">librbd 详细介绍</a>\n<ul>\n<li><a href=\"#%E5%8A%9F%E8%83%BD%E6%A8%A1%E5%9D%97\">功能模块</a></li>\n<li><a href=\"#%E6%A0%B8%E5%BF%83%E6%9C%BA%E5%88%B6\">核心机制</a></li>\n<li><a href=\"#%E7%BB%84%E6%88%90%E5%85%83%E7%B4%A0\">组成元素</a></li>\n<li><a href=\"#%E7%9B%B8%E5%85%B3%E6%8E%A5%E5%8F%A3%E5%A3%B0%E6%98%8E\">相关接口声明</a></li>\n<li><a href=\"#class-ceph_rbd_api-rbd\">class CEPH_RBD_API RBD</a></li>\n<li><a href=\"#class-ceph_rbd_api-image\">class CEPH_RBD_API Image</a></li>\n<li><a href=\"#%E5%85%B7%E4%BD%93%E5%AE%9E%E7%8E%B0\">具体实现</a></li>\n</ul>\n</li>\n<li><a href=\"#cls\">Cls</a>\n<ul>\n<li><a href=\"#client\">Client</a></li>\n<li><a href=\"#server\">Server</a></li>\n</ul>\n</li>\n<li><a href=\"#others\">Others</a></li>\n<li><a href=\"#%E5%88%86%E7%89%87-striper\">分片 Striper</a></li>\n<li><a href=\"#%E6%95%B0%E6%8D%AE-io\">数据 IO</a>\n<ul>\n<li><a href=\"#read\">read</a></li>\n<li><a href=\"#write\">write</a></li>\n</ul>\n</li>\n<li><a href=\"#tcmu-rbd\">TCMU-RBD</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\">参考链接</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2019-09-25 15:20:02","dateFormat":"2019-09-25"},{"fileName":"kill-git","abstract":"<blockquote>\n<ul>\n<li>Git 从入门到掐死教程 (简易教程)</li>\n<li>主要整理了一下之前实习过程中一些 Git 的操作核问题的处理</li>\n<li>并为自己整理的 Git 命令集提供相应的索引</li>\n<li>未完待续~</li>\n</ul>\n</blockquote>\n","description":" Git 从入门到掐死教程 (简易教程) 主要整理了一下之前实习过程中一些 Git 的操作核问题的处理 并为自己整理的 Git 命令集提供相应的索引 未完待续~ 写在前面 Git 相关的基础教程已经很多了，个人觉得对新人比较友好的...","title":"Git 从入门到掐死","tags":[{"name":"工具","slug":"hbaTDSglx-","used":true,"link":"https://blog.shunzi.tech/tag/hbaTDSglx-/"}],"feature":"https://blog.shunzi.tech/post-images/kill-git.jpg","link":"https://blog.shunzi.tech/post/kill-git/","stats":{"text":"7 min read","time":386000,"words":1671,"minutes":7},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#%E5%86%99%E5%9C%A8%E5%89%8D%E9%9D%A2\">写在前面</a></li>\n<li><a href=\"#%E6%AD%A3%E6%96%87\">正文</a>\n<ul>\n<li><a href=\"#git-%E4%BB%93%E5%BA%93%E7%BA%A7%E5%88%AB%E7%9A%84%E7%AE%A1%E7%90%86\">Git 仓库级别的管理</a>\n<ul>\n<li><a href=\"#%E5%88%9B%E5%BB%BA%E7%9A%84%E4%B8%A4%E7%A7%8D%E6%96%B9%E5%BC%8F\">创建的两种方式</a>\n<ul>\n<li><a href=\"#%E4%B8%A4%E7%A7%8D%E5%88%9B%E5%BB%BA%E6%96%B9%E5%BC%8F%E7%9A%84%E5%8C%BA%E5%88%AB\">两种创建方式的区别</a></li>\n</ul>\n</li>\n<li><a href=\"#git-%E6%9C%AC%E5%9C%B0%E4%BB%93%E5%BA%93%E5%BB%BA%E7%AB%8B%E4%B8%8E%E8%BF%9C%E7%A8%8B%E4%BB%93%E5%BA%93%E7%9A%84%E8%81%94%E7%B3%BB\">Git 本地仓库建立与远程仓库的联系</a></li>\n</ul>\n</li>\n<li><a href=\"#git-%E7%9A%84%E6%97%A5%E5%B8%B8%E6%93%8D%E4%BD%9C%E6%B5%81%E7%A8%8B\">Git 的日常操作流程</a>\n<ul>\n<li><a href=\"#1%E5%85%BB%E6%88%90%E5%A5%BD%E4%B9%A0%E6%83%AF-%E5%B7%A5%E4%BD%9C%E4%B9%8B%E5%89%8D%E4%BF%9D%E6%8C%81%E5%90%8C%E6%AD%A5\">1.养成好习惯-工作之前保持同步</a></li>\n<li><a href=\"#2%E5%8F%AF%E9%80%89-%E4%B8%8B%E6%8B%89%E8%BF%87%E7%A8%8B%E7%9A%84%E7%89%B9%E6%AE%8A%E5%A4%84%E7%90%86\">2.(可选) 下拉过程的特殊处理</a></li>\n<li><a href=\"#3%E5%B7%A5%E4%BD%9C%E6%97%B6%E6%B3%A8%E6%84%8F%E6%96%87%E4%BB%B6%E7%BC%96%E7%A0%81%E5%92%8C%E6%96%87%E4%BB%B6%E7%AC%A6%E5%8F%B7\">3.工作时注意文件编码和文件符号</a></li>\n<li><a href=\"#4%E5%8F%AF%E9%80%89-%E6%96%B0%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E5%88%86%E6%94%AF%E7%94%A8%E4%BA%8E%E7%89%B9%E5%AE%9A%E5%8A%9F%E8%83%BD\">4.(可选) 新建一个本地分支用于特定功能</a></li>\n<li><a href=\"#5%E6%B7%BB%E5%8A%A0%E4%BF%AE%E6%94%B9%E5%88%B0%E7%BC%93%E5%86%B2%E5%8C%BA\">5.添加修改到缓冲区</a></li>\n<li><a href=\"#6%E6%8F%90%E4%BA%A4%E7%BC%93%E5%86%B2%E5%8C%BA%E7%9A%84%E5%B8%A6%E8%AF%84%E8%AE%BA%E7%9A%84%E4%BF%AE%E6%94%B9\">6.提交缓冲区的带评论的修改</a></li>\n<li><a href=\"#7%E6%8E%A8%E9%80%81%E5%88%B0%E8%BF%9C%E7%A8%8B%E4%BB%93%E5%BA%93%E7%9A%84%E6%9F%90%E4%B8%AA%E5%88%86%E6%94%AF%E4%BF%9D%E6%8C%81%E4%B8%80%E8%87%B4\">7.推送到远程仓库的某个分支保持一致</a></li>\n<li><a href=\"#8git-%E5%B9%B3%E5%8F%B0%E6%8F%90%E4%BA%A4%E4%B8%80%E4%B8%AA-prmr-%E8%AF%B7%E6%B1%82-review-%E5%92%8C-%E5%90%88%E5%B9%B6\">8.Git 平台提交一个 PR/MR 请求 review 和 合并</a></li>\n</ul>\n</li>\n<li><a href=\"#git-%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%E8%BF%BD%E6%BA%AF\">Git 历史记录追溯</a>\n<ul>\n<li><a href=\"#%E6%9F%A5%E7%9C%8B-git-%E6%8F%90%E4%BA%A4%E8%AE%B0%E5%BD%95%E6%97%A5%E5%BF%97\">查看 Git 提交记录（日志）</a></li>\n<li><a href=\"#%E6%AF%94%E8%BE%83%E5%89%8D%E5%90%8E%E6%8F%90%E4%BA%A4%E7%9A%84%E5%B7%AE%E5%BC%82\">比较前后提交的差异</a></li>\n<li><a href=\"#%E7%89%88%E6%9C%AC%E5%9B%9E%E9%80%80\">版本回退</a></li>\n<li><a href=\"#%E6%9F%A5%E7%9C%8Bgit%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C%E5%8E%86%E5%8F%B2\">查看Git命令执行历史</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2019-09-20 22:42:57","dateFormat":"2019-09-20"},{"fileName":"distributed-cache-notes-one","abstract":"<blockquote>\n<ul>\n<li>分布式缓存读书笔记系列之一</li>\n<li>从缓存的基本概念以及淘汰算法简单介绍入手</li>\n<li>介绍优秀缓存框架的实现（本地缓存和集中式缓存）</li>\n</ul>\n</blockquote>\n","description":" 分布式缓存读书笔记系列之一 从缓存的基本概念以及淘汰算法简单介绍入手 介绍优秀缓存框架的实现（本地缓存和集中式缓存） 缓存基本概念 缓存分类（软件系统中分类） 根据所处位置的不同划分为： 客户端缓存： BS 应用中页面的缓存（...","title":"分布式缓存读书笔记（一）","tags":[{"name":"缓存","slug":"9msH-lUaA","used":true,"link":"https://blog.shunzi.tech/tag/9msH-lUaA/"},{"name":"分布式","slug":"geK0jEW-T","used":true,"link":"https://blog.shunzi.tech/tag/geK0jEW-T/"}],"feature":"https://blog.shunzi.tech/post-images/distributed-cache-notes-one.jpg","link":"https://blog.shunzi.tech/post/distributed-cache-notes-one/","stats":{"text":"56 min read","time":3303000,"words":15262,"minutes":56},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#%E7%BC%93%E5%AD%98%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5\">缓存基本概念</a>\n<ul>\n<li><a href=\"#%E7%BC%93%E5%AD%98%E5%88%86%E7%B1%BB%E8%BD%AF%E4%BB%B6%E7%B3%BB%E7%BB%9F%E4%B8%AD%E5%88%86%E7%B1%BB\">缓存分类（软件系统中分类）</a></li>\n<li><a href=\"#%E7%BC%93%E5%AD%98%E7%AE%97%E6%B3%95%E6%9B%BF%E4%BB%A3%E7%AD%96%E7%95%A5\">缓存算法（替代策略）</a>\n<ul>\n<li><a href=\"#lru-least-recently-used\">LRU - Least Recently Used</a></li>\n<li><a href=\"#lfu-least-frequently-used\">LFU - Least Frequently Used</a></li>\n<li><a href=\"#lru2-least-recently-used-2\">LRU2 - Least Recently Used 2</a></li>\n<li><a href=\"#2q-two-queue\">2Q - Two Queue</a></li>\n<li><a href=\"#size\">SIZE</a></li>\n<li><a href=\"#lru-threshold\">LRU-Threshold</a></li>\n<li><a href=\"#logsizelru\">Log(Size)+LRU</a></li>\n<li><a href=\"#hyper-g\">Hyper-G</a></li>\n<li><a href=\"#pitkowrecker\">Pitkow/Recker</a></li>\n<li><a href=\"#arc-adaptive-replacement-cache\">ARC - Adaptive Replacement Cache</a></li>\n<li><a href=\"#mru-most-recently-used\">MRU - Most Recently Used</a></li>\n<li><a href=\"#fifo-first-in-first-out\">FIFO - First In First Out</a></li>\n<li><a href=\"#random-cache\">Random Cache</a></li>\n</ul>\n</li>\n<li><a href=\"#%E7%BC%93%E5%AD%98%E7%9A%84%E5%8E%9F%E7%90%86\">缓存的原理</a>\n<ul>\n<li><a href=\"#%E7%BC%93%E5%AD%98%E7%9A%84%E8%A7%84%E8%8C%83\">缓存的规范</a>\n<ul>\n<li><a href=\"#jcache-api\">JCache API</a></li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\">参考链接</a></li>\n</ul>\n</li>\n<li><a href=\"#%E7%BC%93%E5%AD%98%E6%A1%86%E6%9E%B6%E7%9A%84%E5%AE%9E%E7%8E%B0\">缓存框架的实现</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#ehcache-%E5%92%8C-guava-cache\">Ehcache 和 Guava Cache</a>\n<ul>\n<li><a href=\"#ehcache\">Ehcache</a>\n<ul>\n<li><a href=\"#%E4%B8%BB%E8%A6%81%E7%89%B9%E7%82%B9\">主要特点</a></li>\n<li><a href=\"#%E5%85%B7%E4%BD%93%E4%BD%BF%E7%94%A8\">具体使用</a>\n<ul>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5-2\">参考链接</a></li>\n</ul>\n</li>\n<li><a href=\"#ehcache-%E9%9B%86%E7%BE%A4\">Ehcache 集群</a>\n<ul>\n<li><a href=\"#rmi-%E7%BB%84%E6%92%AD%E6%96%B9%E5%BC%8F\">RMI 组播方式</a></li>\n<li><a href=\"#jms-%E6%B6%88%E6%81%AF%E6%96%B9%E5%BC%8F\">JMS 消息方式</a></li>\n<li><a href=\"#cache-server-%E6%A8%A1%E5%BC%8F\">Cache Server 模式</a></li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5-3\">参考链接</a></li>\n</ul>\n</li>\n<li><a href=\"#ehcache-%E9%80%82%E7%94%A8%E5%9C%BA%E6%99%AF\">Ehcache 适用场景</a></li>\n<li><a href=\"#ehcache-%E7%9A%84%E7%93%B6%E9%A2%88\">Ehcache 的瓶颈</a></li>\n<li><a href=\"#%E5%AE%9E%E9%99%85%E5%BA%94%E7%94%A8\">实际应用</a>\n<ul>\n<li><a href=\"#%E5%87%8F%E5%B0%8F%E7%BC%93%E5%AD%98%E5%87%BB%E7%A9%BF%E7%9A%84%E9%A3%8E%E9%99%A9\">减小缓存击穿的风险</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#guava-cache\">Guava Cache</a>\n<ul>\n<li><a href=\"#%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF\">使用场景</a></li>\n<li><a href=\"#%E5%85%B7%E4%BD%93%E4%BD%BF%E7%94%A8-2\">具体使用</a>\n<ul>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5-4\">参考链接</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%B7%98%E6%B1%B0%E7%AD%96%E7%95%A5\">淘汰策略</a>\n<ul>\n<li><a href=\"#%E8%A2%AB%E5%8A%A8%E5%88%A0%E9%99%A4\">被动删除</a></li>\n<li><a href=\"#%E4%B8%BB%E5%8A%A8%E5%88%A0%E9%99%A4\">主动删除</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E9%9B%86%E4%B8%AD%E5%BC%8F%E7%BC%93%E5%AD%98-memcached\">集中式缓存 Memcached</a>\n<ul>\n<li><a href=\"#%E7%89%B9%E6%80%A7\">特性</a></li>\n<li><a href=\"#%E9%97%AE%E9%A2%98\">问题</a></li>\n<li><a href=\"#%E5%86%85%E5%AD%98%E5%AD%98%E5%82%A8\">内存存储</a>\n<ul>\n<li><a href=\"#slab-allocation-%E6%9C%BA%E5%88%B6\">Slab-Allocation 机制</a></li>\n<li><a href=\"#%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5\">核心概念</a></li>\n<li><a href=\"#item\">Item</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%85%B8%E5%9E%8B%E9%97%AE%E9%A2%98%E8%A7%A3%E6%9E%90\">典型问题解析</a>\n<ul>\n<li><a href=\"#%E8%BF%87%E6%9C%9F%E6%9C%BA%E5%88%B6\">过期机制</a></li>\n<li><a href=\"#%E5%93%88%E5%B8%8C%E7%AE%97%E6%B3%95\">哈希算法</a></li>\n<li><a href=\"#%E7%83%AD%E7%82%B9%E9%97%AE%E9%A2%98\">热点问题</a></li>\n<li><a href=\"#%E7%BC%93%E5%AD%98%E4%B8%8E%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E6%9B%B4%E6%96%B0%E9%97%AE%E9%A2%98\">缓存与数据库的更新问题</a>\n<ul>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5-5\">参考链接</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4\">命名空间</a></li>\n<li><a href=\"#cas\">CAS</a>\n<ul>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5-6\">参考链接</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#memcached-%E5%AE%A2%E6%88%B7%E7%AB%AF\">Memcached 客户端</a>\n<ul>\n<li><a href=\"#spymemcached-%E8%AE%BE%E8%AE%A1%E6%80%9D%E6%83%B3%E8%A7%A3%E6%9E%90\">Spymemcached 设计思想解析</a>\n<ul>\n<li><a href=\"#%E7%89%B9%E6%80%A7-2\">特性</a></li>\n<li><a href=\"#%E6%95%B4%E4%BD%93%E8%AE%BE%E8%AE%A1\">整体设计</a></li>\n<li><a href=\"#sharding-%E6%9C%BA%E5%88%B6%E5%8F%8A%E5%AE%B9%E9%94%99\">sharding 机制及容错</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#redis\">Redis</a>\n<ul>\n<li><a href=\"#%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84\">数据结构</a>\n<ul>\n<li><a href=\"#%E9%80%9A%E7%94%A8%E7%9A%84%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84\">通用的数据结构</a></li>\n<li><a href=\"#%E5%85%B7%E4%BD%93%E7%9A%84%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84\">具体的数据结构</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%B8%8E%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E4%BA%A4%E4%BA%92\">客户端与服务器的交互</a>\n<ul>\n<li><a href=\"#%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%8D%8F%E8%AE%AE\">客户端/服务器协议</a>\n<ul>\n<li><a href=\"#%E7%BD%91%E7%BB%9C%E4%BA%A4%E4%BA%92\">网络交互</a></li>\n<li><a href=\"#%E5%BA%8F%E5%88%97%E5%8C%96%E5%8D%8F%E8%AE%AE\">序列化协议</a></li>\n</ul>\n</li>\n<li><a href=\"#%E8%AF%B7%E6%B1%82%E5%93%8D%E5%BA%94%E6%A8%A1%E5%BC%8F\">请求/响应模式</a>\n<ul>\n<li><a href=\"#%E4%B8%B2%E8%A1%8C%E5%8C%96%E5%AE%9E%E7%8E%B0\">串行化实现</a></li>\n<li><a href=\"#pipeline%E5%AE%9E%E7%8E%B0\">pipeline实现</a></li>\n</ul>\n</li>\n<li><a href=\"#%E4%BA%8B%E5%8A%A1%E6%A8%A1%E5%BC%8F\">事务模式</a>\n<ul>\n<li><a href=\"#%E4%B8%A4%E9%98%B6%E6%AE%B5%E4%BF%9D%E8%AF%81%E4%BA%8B%E5%8A%A1%E5%8E%9F%E5%AD%90%E6%80%A7\">两阶段保证事务原子性</a></li>\n<li><a href=\"#%E4%BA%8B%E5%8A%A1%E7%9A%84%E4%B8%80%E8%87%B4%E6%80%A7\">事务的一致性</a></li>\n<li><a href=\"#%E4%BA%8B%E5%8A%A1%E7%9A%84%E5%8F%AA%E8%AF%BB%E6%93%8D%E4%BD%9C\">事务的只读操作</a></li>\n<li><a href=\"#%E4%B9%90%E8%A7%82%E9%94%81%E7%9A%84%E5%8F%AF%E4%B8%B2%E8%A1%8C%E5%8C%96%E4%BA%8B%E5%8A%A1%E9%9A%94%E7%A6%BB\">乐观锁的可串行化事务隔离</a></li>\n</ul>\n</li>\n<li><a href=\"#%E8%84%9A%E6%9C%AC%E6%A8%A1%E5%BC%8F\">脚本模式</a></li>\n<li><a href=\"#%E5%8F%91%E5%B8%83%E8%AE%A2%E9%98%85%E6%A8%A1%E5%BC%8F\">发布/订阅模式</a>\n<ul>\n<li><a href=\"#%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5-2\">核心概念</a></li>\n<li><a href=\"#%E4%B8%A4%E7%B1%BB-channel\">两类 channel</a></li>\n<li><a href=\"#%E8%AE%A2%E9%98%85%E5%85%B3%E7%B3%BB%E7%9A%84%E5%AE%9E%E7%8E%B0\">订阅关系的实现</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E5%8D%95%E6%9C%BA%E5%A4%84%E7%90%86%E9%80%BB%E8%BE%91\">单机处理逻辑</a>\n<ul>\n<li><a href=\"#%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8\">多路复用</a></li>\n<li><a href=\"#%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E5%A4%84%E7%90%86\">定时任务处理</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%8C%81%E4%B9%85%E5%8C%96\">持久化</a>\n<ul>\n<li><a href=\"#%E5%85%A8%E9%87%8F%E6%A8%A1%E5%BC%8F\">全量模式</a>\n<ul>\n<li><a href=\"#%E5%86%99%E5%85%A5%E6%B5%81%E7%A8%8B\">写入流程</a></li>\n<li><a href=\"#%E6%81%A2%E5%A4%8D%E6%B5%81%E7%A8%8B\">恢复流程</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%A2%9E%E9%87%8F%E6%A8%A1%E5%BC%8Fappend-only-file\">增量模式（Append-only File）</a>\n<ul>\n<li><a href=\"#%E5%86%99%E5%85%A5%E6%B5%81%E7%A8%8B-2\">写入流程</a></li>\n<li><a href=\"#%E6%81%A2%E5%A4%8D%E6%B5%81%E7%A8%8B-2\">恢复流程</a></li>\n<li><a href=\"#%E4%BC%98%E5%8C%96\">优化</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E5%88%86%E5%B8%83%E5%BC%8F-redis\">分布式 Redis</a>\n<ul>\n<li><a href=\"#%E6%B0%B4%E5%B9%B3%E6%8B%86%E5%88%86\">水平拆分</a>\n<ul>\n<li><a href=\"#%E6%95%B0%E6%8D%AE%E5%88%86%E5%B8%83\">数据分布</a>\n<ul>\n<li><a href=\"#hash-%E6%98%A0%E5%B0%84\">hash 映射</a></li>\n<li><a href=\"#%E8%8C%83%E5%9B%B4%E6%98%A0%E5%B0%84\">范围映射</a></li>\n<li><a href=\"#hash-%E5%92%8C%E8%8C%83%E5%9B%B4%E7%BB%93%E5%90%88\">hash 和范围结合</a></li>\n</ul>\n</li>\n<li><a href=\"#%E8%AF%B7%E6%B1%82%E8%B7%AF%E7%94%B1\">请求路由</a>\n<ul>\n<li><a href=\"#%E5%8F%AA%E8%AF%BB%E7%9A%84%E8%B7%A8%E5%AE%9E%E4%BE%8B%E8%AF%B7%E6%B1%82\">只读的跨实例请求</a></li>\n<li><a href=\"#%E8%B7%A8%E5%AE%9E%E4%BE%8B%E7%9A%84%E5%8E%9F%E5%AD%90%E8%AF%BB%E5%86%99%E8%AF%B7%E6%B1%82\">跨实例的原子读写请求</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E4%B8%BB%E5%A4%87%E5%A4%8D%E5%88%B6\">主备复制</a>\n<ul>\n<li><a href=\"#%E4%B8%BB%E5%A4%87%E5%A4%8D%E5%88%B6%E6%B5%81%E7%A8%8B\">主备复制流程</a></li>\n<li><a href=\"#%E6%96%AD%E7%82%B9%E7%BB%AD%E4%BC%A0\">断点续传</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%95%85%E9%9A%9C%E8%BF%81%E7%A7%BB-failover\">故障迁移 Failover</a>\n<ul>\n<li><a href=\"#sentinel-%E8%8A%82%E7%82%B9%E9%97%B4%E7%9A%84%E7%9B%B8%E4%BA%92%E6%84%9F%E7%9F%A5\">sentinel 节点间的相互感知</a></li>\n<li><a href=\"#master-%E7%9A%84%E6%95%85%E9%9A%9C%E5%8F%91%E7%8E%B0\">master 的故障发现</a></li>\n<li><a href=\"#%E6%95%85%E9%9A%9C%E8%BF%81%E7%A7%BB%E5%86%B3%E7%AD%96\">故障迁移决策</a></li>\n</ul>\n</li>\n<li><a href=\"#redis-cluster\">Redis Cluster</a>\n<ul>\n<li><a href=\"#%E6%8B%93%E6%89%91%E7%BB%93%E6%9E%84\">拓扑结构</a></li>\n<li><a href=\"#%E9%85%8D%E7%BD%AE%E7%9A%84%E4%B8%80%E8%87%B4%E6%80%A7\">配置的一致性</a>\n<ul>\n<li><a href=\"#%E9%85%8D%E7%BD%AE%E4%BF%A1%E6%81%AF%E7%9A%84%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84\">配置信息的数据结构</a></li>\n<li><a href=\"#%E4%BF%A1%E6%81%AF%E4%BA%A4%E4%BA%92\">信息交互</a></li>\n<li><a href=\"#%E4%B8%80%E8%87%B4%E6%80%A7%E7%9A%84%E8%BE%BE%E6%88%90\">一致性的达成</a></li>\n</ul>\n</li>\n<li><a href=\"#sharding\">sharding</a>\n<ul>\n<li><a href=\"#%E6%95%B0%E6%8D%AE%E5%88%86%E7%89%87-slot\">数据分片 slot</a></li>\n<li><a href=\"#%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%B7%AF%E7%94%B1\">客户端路由</a></li>\n<li><a href=\"#%E5%88%86%E7%89%87%E7%9A%84%E8%BF%81%E7%A7%BB\">分片的迁移</a></li>\n</ul>\n</li>\n<li><a href=\"#failover\">failover</a>\n<ul>\n<li><a href=\"#%E6%95%85%E9%9A%9C%E5%8F%91%E7%8E%B0\">故障发现</a></li>\n<li><a href=\"#%E6%95%85%E9%9A%9C%E7%A1%AE%E8%AE%A4\">故障确认</a></li>\n<li><a href=\"#slave%E9%80%89%E4%B8%BE\">Slave选举</a></li>\n<li><a href=\"#%E7%BB%93%E6%9E%84%E5%8F%98%E6%9B%B4%E9%80%9A%E7%9F%A5\">结构变更通知</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%8F%AF%E7%94%A8%E6%80%A7%E5%92%8C%E6%80%A7%E8%83%BD\">可用性和性能</a>\n<ul>\n<li><a href=\"#%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB\">读写分离</a></li>\n<li><a href=\"#master-%E5%8D%95%E7%82%B9%E4%BF%9D%E6%8A%A4\">master 单点保护</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2019-09-03 17:31:10","dateFormat":"2019-09-03"},{"fileName":"tutorial","abstract":"<blockquote>\n<ul>\n<li>源于众多朋友、同学和学弟（对没有学妹）请教过 Java 学习路线的相关问题</li>\n<li>在这篇博客中对曾经使用到或者收集的教程和优秀博客进行一个汇总</li>\n<li>主要从各大编程语言入门的角度，同时也更新各个方向的相关技术栈</li>\n<li>持续更新ing</li>\n</ul>\n</blockquote>\n","description":" 源于众多朋友、同学和学弟（对没有学妹）请教过 Java 学习路线的相关问题 在这篇博客中对曾经使用到或者收集的教程和优秀博客进行一个汇总 主要从各大编程语言入门的角度，同时也更新各个方向的相关技术栈 持续更新ing 编程语言导向篇...","title":"编程语言-教程和案例汇总","tags":[{"name":"编程语言","slug":"n2w6bz87h","used":true,"link":"https://blog.shunzi.tech/tag/n2w6bz87h/"}],"feature":"https://blog.shunzi.tech/post-images/tutorial.jpg","link":"https://blog.shunzi.tech/post/tutorial/","stats":{"text":"7 min read","time":380000,"words":1834,"minutes":7},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80%E5%AF%BC%E5%90%91%E7%AF%87\">编程语言导向篇</a>\n<ul>\n<li><a href=\"#java\">Java</a>\n<ul>\n<li><a href=\"#%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF%E5%92%8C%E6%95%99%E7%A8%8B\">学习路线和教程</a></li>\n<li><a href=\"#%E5%85%A5%E9%97%A8%E6%96%B9%E5%BC%8F\">入门方式</a>\n<ul>\n<li><a href=\"#%E8%A7%86%E9%A2%91%E7%AF%87\">视频篇：</a></li>\n<li><a href=\"#%E5%8D%9A%E5%AE%A2%E7%AF%87\">博客篇</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%B7%B1%E5%85%A5%E5%AD%A6%E4%B9%A0\">深入学习</a></li>\n</ul>\n</li>\n<li><a href=\"#python-%E7%AF%87\">Python 篇</a>\n<ul>\n<li><a href=\"#%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B\">入门教程</a></li>\n<li><a href=\"#%E9%AB%98%E7%BA%A7%E6%95%99%E7%A8%8B\">高级教程</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2019-09-02 14:54:39","dateFormat":"2019-09-02"},{"fileName":"basic-concept-of-distributed-system","abstract":"<blockquote>\n<ul>\n<li>介绍总结一些基本的分布式系统中的概念</li>\n<li>简要介绍分布式系统中常见的问题和解决方案</li>\n<li>后续会针对部分分布式常用组件进一步介绍</li>\n</ul>\n</blockquote>\n","description":" 介绍总结一些基本的分布式系统中的概念 简要介绍分布式系统中常见的问题和解决方案 后续会针对部分分布式常用组件进一步介绍 分布式系统理论 CAP定理 在理论计算机科学中，CAP定理（CAP theorem），又被称作布鲁尔定理（B...","title":"分布式系统基本概念","tags":[{"name":"分布式","slug":"geK0jEW-T","used":true,"link":"https://blog.shunzi.tech/tag/geK0jEW-T/"}],"feature":"https://blog.shunzi.tech/post-images/basic-concept-of-distributed-system.png","link":"https://blog.shunzi.tech/post/basic-concept-of-distributed-system/","stats":{"text":"19 min read","time":1125000,"words":5376,"minutes":19},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F%E7%90%86%E8%AE%BA\">分布式系统理论</a>\n<ul>\n<li><a href=\"#cap%E5%AE%9A%E7%90%86\">CAP定理</a>\n<ul>\n<li><a href=\"#%E4%B8%80%E8%87%B4%E6%80%A7consistency\">一致性（Consistency）</a>\n<ul>\n<li><a href=\"#%E6%93%8D%E4%BD%9C%E5%8E%9F%E5%AD%90%E6%80%A7\">操作原子性</a>\n<ul>\n<li><a href=\"#2pctwo-phase-commit-%E9%98%BB%E5%A1%9E-%E6%95%B0%E6%8D%AE%E4%B8%8D%E4%B8%80%E8%87%B4%E9%97%AE%E9%A2%98-%E5%8D%95%E7%82%B9%E9%97%AE%E9%A2%98\">2PC（Two-Phase Commit）- 阻塞、数据不一致问题、单点问题</a></li>\n<li><a href=\"#3pc-thress-phase-commit-%E8%A7%A3%E5%86%B32pc%E7%9A%84%E9%98%BB%E5%A1%9E%E4%BD%86%E8%BF%98%E6%98%AF%E5%8F%AF%E8%83%BD%E9%80%A0%E6%88%90%E6%95%B0%E6%8D%AE%E4%B8%8D%E4%B8%80%E8%87%B4\">3PC (Thress-Phase Commit) - 解决2PC的阻塞，但还是可能造成数据不一致</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%89%AF%E6%9C%AC%E4%B8%80%E8%87%B4%E6%80%A7\">副本一致性</a></li>\n<li><a href=\"#consensus-algorithm-%E5%8D%8F%E5%90%8C%E7%AE%97%E6%B3%95\">Consensus Algorithm 协同算法</a>\n<ul>\n<li><a href=\"#paxos%E7%AE%97%E6%B3%95%E8%A7%A3%E5%86%B3%E5%8D%95%E7%82%B9%E9%97%AE%E9%A2%98\">Paxos算法（解决单点问题）</a></li>\n<li><a href=\"#raft-%E4%B8%80%E8%87%B4%E6%80%A7%E7%AE%97%E6%B3%95%E8%A7%A3%E5%86%B3paxos%E7%9A%84%E5%AE%9E%E7%8E%B0%E9%9A%BE%E5%BA%A6\">Raft 一致性算法（解决Paxos的实现难度）</a></li>\n</ul>\n</li>\n<li><a href=\"#lease%E6%9C%BA%E5%88%B6\">Lease机制</a></li>\n<li><a href=\"#quorum-nwr\">Quorum NWR</a></li>\n<li><a href=\"#%E5%A4%9A%E7%89%88%E6%9C%AC%E5%B9%B6%E5%8F%91%E6%8E%A7%E5%88%B6-mvcc\">多版本并发控制 MVCC</a></li>\n<li><a href=\"#gossip\">Gossip</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%8F%AF%E7%94%A8%E6%80%A7availability\">可用性（Availability）</a>\n<ul>\n<li><a href=\"#%E5%8F%AF%E7%94%A8%E6%80%A7-vs-%E5%8F%AF%E9%9D%A0%E6%80%A7\">可用性 VS 可靠性</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%88%86%E5%8C%BA%E5%AE%B9%E9%94%99%E6%80%A7partition-tolerance\">分区容错性（Partition tolerance）</a></li>\n<li><a href=\"#ca\">CA</a></li>\n<li><a href=\"#cp\">CP</a></li>\n<li><a href=\"#ap\">AP</a></li>\n</ul>\n</li>\n<li><a href=\"#base%E7%90%86%E8%AE%BA\">BASE理论</a>\n<ul>\n<li><a href=\"#%E5%9F%BA%E6%9C%AC%E5%8F%AF%E7%94%A8basically-available\">基本可用（Basically Available）</a></li>\n<li><a href=\"#%E8%BD%AF%E7%8A%B6%E6%80%81soft-state\">软状态（Soft State）</a></li>\n<li><a href=\"#%E6%9C%80%E7%BB%88%E4%B8%80%E8%87%B4%E6%80%A7eventually-consistent\">最终一致性（Eventually Consistent）</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\">参考链接</a></li>\n<li><a href=\"#%E5%85%B6%E4%BB%96%E6%A6%82%E5%BF%B5\">其他概念</a>\n<ul>\n<li><a href=\"#%E7%8A%B6%E6%80%81%E7%89%B9%E6%80%A7\">状态特性</a></li>\n<li><a href=\"#%E7%B3%BB%E7%BB%9F%E9%87%8D%E5%8F%91%E4%B8%8E%E5%B9%82%E7%AD%89%E6%80%A7\">系统重发与幂等性</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F%E5%B8%B8%E8%A7%81%E8%AE%BE%E8%AE%A1%E7%AD%96%E7%95%A5\">分布式系统常见设计策略</a>\n<ul>\n<li><a href=\"#%E5%BF%83%E8%B7%B3%E6%A3%80%E6%B5%8B\">心跳检测</a>\n<ul>\n<li><a href=\"#%E5%91%A8%E6%9C%9F%E6%A3%80%E6%B5%8B%E5%BF%83%E8%B7%B3%E6%9C%BA%E5%88%B6%E5%92%8C%E7%B4%AF%E8%AE%A1%E5%A4%B1%E6%95%88%E6%A3%80%E6%B5%8B%E6%9C%BA%E5%88%B6\">周期检测心跳机制和累计失效检测机制</a></li>\n</ul>\n</li>\n<li><a href=\"#%E9%AB%98%E5%8F%AF%E7%94%A8%E8%AE%BE%E8%AE%A1\">高可用设计</a>\n<ul>\n<li><a href=\"#%E4%B8%BB%E5%A4%87-master-salve\">主备 （Master-Salve）</a></li>\n<li><a href=\"#%E4%BA%92%E5%A4%87-%E5%8F%8C%E6%B4%BBactive-active\">互备-双活（Active-Active）</a></li>\n<li><a href=\"#%E9%9B%86%E7%BE%A4cluster\">集群（Cluster）</a></li>\n<li><a href=\"#%E5%AE%B9%E9%94%99%E6%80%A7\">容错性</a></li>\n</ul>\n</li>\n<li><a href=\"#%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1\">负载均衡</a></li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5-2\">参考链接</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%E5%AE%9E%E8%B7%B5\">分布式系统设计实践</a>\n<ul>\n<li><a href=\"#%E5%85%A8%E5%B1%80id%E7%94%9F%E6%88%90\">全局ID生成</a>\n<ul>\n<li><a href=\"#uuid\">UUID</a></li>\n<li><a href=\"#id%E7%94%9F%E6%88%90%E8%A1%A8%E6%A8%A1%E5%BC%8F\">ID生成表模式</a></li>\n<li><a href=\"#snowflake-%E9%9B%AA%E8%8A%B1%E7%AE%97%E6%B3%95\">Snowflake 雪花算法</a></li>\n<li><a href=\"#id%E7%94%9F%E6%88%90%E8%A1%A8%E7%BC%93%E5%AD%98\">ID生成表+缓存</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%93%88%E5%B8%8C%E5%8F%96%E6%A8%A1\">哈希取模</a></li>\n<li><a href=\"#%E4%B8%80%E8%87%B4%E6%80%A7hash\">一致性hash</a></li>\n<li><a href=\"#%E8%B7%AF%E7%94%B1%E8%A1%A8\">路由表</a></li>\n<li><a href=\"#%E6%95%B0%E6%8D%AE%E6%8B%86%E5%88%86\">数据拆分</a></li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5-3\">参考链接</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F%E4%B8%AD%E5%B8%B8%E8%A7%81%E7%9A%84%E9%97%AE%E9%A2%98\">分布式系统中常见的问题</a>\n<ul>\n<li><a href=\"#%E8%84%91%E8%A3%82%E9%97%AE%E9%A2%98\">脑裂问题</a></li>\n</ul>\n</li>\n<li><a href=\"#rpc-remote-procedure-call\">RPC (Remote Procedure Call)</a>\n<ul>\n<li><a href=\"#rpc-%E6%9E%B6%E6%9E%84\">RPC 架构</a></li>\n<li><a href=\"#rpc%E6%A1%86%E6%9E%B6\">RPC框架</a></li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5-4\">参考链接</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2019-08-23 15:22:58","dateFormat":"2019-08-23"},{"fileName":"c-header","abstract":"<blockquote>\n<ul>\n<li>常见的C语言库函数介绍（主要针对IO相关操作）</li>\n<li>部分函数仅为linux系统特有</li>\n<li>后续会对相关系统调用中涉及到的IO进行讲解</li>\n</ul>\n</blockquote>\n","description":" 常见的C语言库函数介绍（主要针对IO相关操作） 部分函数仅为linux系统特有 后续会对相关系统调用中涉及到的IO进行讲解 常见的C语言库函数 #include &lt;stdio.h&gt; int open(const cha...","title":"常见的C语言库函数","tags":[{"name":"C语言","slug":"5h7k39FKw","used":true,"link":"https://blog.shunzi.tech/tag/5h7k39FKw/"},{"name":"Linux","slug":"EO3XpMf_y","used":true,"link":"https://blog.shunzi.tech/tag/EO3XpMf_y/"}],"feature":"https://blog.shunzi.tech/post-images/c-header.jpg","link":"https://blog.shunzi.tech/post/c-header/","stats":{"text":"10 min read","time":597000,"words":2681,"minutes":10},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#%E5%B8%B8%E8%A7%81%E7%9A%84c%E8%AF%AD%E8%A8%80%E5%BA%93%E5%87%BD%E6%95%B0\">常见的C语言库函数</a>\n<ul>\n<li><a href=\"#include-stdioh\">#include &lt;stdio.h&gt;</a>\n<ul>\n<li><a href=\"#int-openconst-char-pathint-accessunsigned-mode\">int open(const char *path,int access[,unsigned mode])</a></li>\n<li><a href=\"#int-closeint-handle\">int close(int handle)</a></li>\n<li><a href=\"#file-fopenconst-char-path-const-char-mode\">FILE* fopen(const char *path, const char *mode)</a></li>\n<li><a href=\"#int-fclosefile-stream\">int fclose(FILE *stream);</a></li>\n<li><a href=\"#int-fseekfile-stream-long-offset-int-fromwhere\">int fseek(FILE *stream, long offset, int fromwhere);</a></li>\n<li><a href=\"#long-ftellfile-stream\">long ftell(FILE *stream);</a></li>\n<li><a href=\"#size_t-fread-void-buffer-size_t-size-size_t-count-file-stream\">size_t fread ( void *buffer, size_t size, size_t count, FILE *stream);</a></li>\n<li><a href=\"#size_t-fwriteconst-void-ptr-size_t-size-size_t-nmemb-file-stream\">size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);</a></li>\n</ul>\n</li>\n<li><a href=\"#include-sysuioh\">#include &lt;sys/uio.h&gt;</a>\n<ul>\n<li><a href=\"#ssize_t-preadint-fd-void-buf-size_t-count-off_t-offset\">ssize_t pread(int fd, void *buf, size_t count, off_t offset);</a></li>\n<li><a href=\"#ssize_t-pwriteint-fd-const-void-buf-size_t-count-off_t-offset\">ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);</a></li>\n<li><a href=\"#ssize_t-readvint-fd-const-struct-iovec-iov-int-iovcnt\">ssize_t readv(int fd, const struct iovec *iov, int iovcnt);</a></li>\n<li><a href=\"#ssize_t-writevint-fd-const-struct-iovec-iov-int-iovcnt\">ssize_t writev(int fd, const struct iovec *iov, int iovcnt);</a></li>\n<li><a href=\"#ssize_t-preadvint-fd-const-struct-iovec-iov-int-iovcnt-off_t-offset\">ssize_t preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset);</a></li>\n<li><a href=\"#ssize_t-pwritevint-fd-const-struct-iovec-iov-int-iovcnt-off_t-offset\">ssize_t pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset);</a></li>\n</ul>\n</li>\n<li><a href=\"#includeunistdh\">#include&lt;unistd.h&gt;</a>\n<ul>\n<li><a href=\"#int-fsyncint-fd\">int fsync(int fd)</a></li>\n<li><a href=\"#int-fdatasyncint-fd\">int fdatasync(int fd);</a></li>\n</ul>\n</li>\n<li><a href=\"#incude-sysmmanh\">#incude &lt;sys/mman.h&gt;</a>\n<ul>\n<li><a href=\"#int-msyncvoid-addr-size_t-length-int-flags\">int msync(void *addr, size_t length, int flags)</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\">参考链接：</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2019-08-21 20:56:23","dateFormat":"2019-08-21"},{"fileName":"one","abstract":"<blockquote>\n<ul>\n<li>主题和<a href=\"https://blog.shunzi.tech/post/One%20quarter/\">《四分之一》</a>一样的系列日志。</li>\n<li>距离上次写已经三年了，也很难有以往的文字功底。</li>\n<li>经历倒是只增不减，但主要是没了那份初心与热情才拖到了现在。</li>\n<li>想写下来的太多，但到了真正写的时候愿意写出来的太少。</li>\n</ul>\n</blockquote>\n","description":" 主题和《四分之一》一样的系列日志。 距离上次写已经三年了，也很难有以往的文字功底。 经历倒是只增不减，但主要是没了那份初心与热情才拖到了现在。 想写下来的太多，但到了真正写的时候愿意写出来的太少。 开头 纵观四年象...","title":"一","tags":[{"index":-1,"name":"Diary","slug":"diary","used":true,"link":"https://blog.shunzi.tech/tag/diary/"}],"feature":"https://blog.shunzi.tech/post-images/one.jpg","link":"https://blog.shunzi.tech/post/one/","stats":{"text":"18 min read","time":1067000,"words":5325,"minutes":18},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#%E5%BC%80%E5%A4%B4\">开头</a></li>\n<li><a href=\"#%E6%AD%A3%E6%96%87\">正文</a>\n<ul>\n<li><a href=\"#%E5%9B%9B%E5%B9%B4%E7%A4%BE%E4%BA%A4%E6%8A%A5%E5%91%8A%E6%80%BB%E7%BB%93\">四年社交报告总结</a></li>\n<li><a href=\"#%E8%87%AA%E5%B7%B1%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%84%9F%E5%8F%97\">自己的现状和感受</a></li>\n<li><a href=\"#%E6%80%BB%E6%9C%89%E7%9D%80%E5%A4%A7%E5%A4%A7%E5%B0%8F%E5%B0%8F%E7%9A%84%E6%AF%9B%E7%97%85\">总有着大大小小的毛病</a></li>\n<li><a href=\"#%E5%9B%9B%E5%B9%B4%E8%B1%A1%E7%89%99%E5%A1%94%E7%94%9F%E6%B4%BB%E6%80%BB%E7%BB%93\">四年象牙塔生活总结</a></li>\n</ul>\n</li>\n<li><a href=\"#%E7%BB%93%E5%B0%BE\">结尾</a></li>\n</ul>\n</li>\n</ul>\n","date":"2019-08-11 14:57:49","dateFormat":"2019-08-11"},{"fileName":"file-and-charset","abstract":"<blockquote>\n<ul>\n<li>一个在重写tcmu读写接口时遇到的问题：如何转化标准的块设备读写缓冲区？</li>\n<li>由于最初不理解相关数据底层编码方式，导致开发过程效率低下。</li>\n<li>在此总结编码相关和文件数据相关的基础知识。</li>\n</ul>\n</blockquote>\n","description":" 一个在重写tcmu读写接口时遇到的问题：如何转化标准的块设备读写缓冲区？ 由于最初不理解相关数据底层编码方式，导致开发过程效率低下。 在此总结编码相关和文件数据相关的基础知识。 字符编码与文件 字符编码 ASCII 基本概念 A...","title":"字符编码与文件","tags":[{"name":"计算机基础","slug":"DyzFtOe6x","used":true,"link":"https://blog.shunzi.tech/tag/DyzFtOe6x/"}],"feature":"https://blog.shunzi.tech/post-images/file-and-charset.jpg","link":"https://blog.shunzi.tech/post/file-and-charset/","stats":{"text":"10 min read","time":587000,"words":2767,"minutes":10},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li><a href=\"#%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%E4%B8%8E%E6%96%87%E4%BB%B6\">字符编码与文件</a>\n<ul>\n<li><a href=\"#%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81\">字符编码</a>\n<ul>\n<li><a href=\"#ascii\">ASCII</a>\n<ul>\n<li><a href=\"#%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5\">基本概念</a></li>\n<li><a href=\"#%E7%BB%84%E6%88%90\">组成</a></li>\n<li><a href=\"#%E5%BA%94%E7%94%A8\">应用</a></li>\n<li><a href=\"#%E7%BC%BA%E9%99%B7\">缺陷</a></li>\n</ul>\n</li>\n<li><a href=\"#base64\">Base64</a>\n<ul>\n<li><a href=\"#%E6%A6%82%E5%BF%B5\">概念</a></li>\n<li><a href=\"#%E7%BB%84%E6%88%90-2\">组成</a></li>\n<li><a href=\"#%E5%BA%94%E7%94%A8-2\">应用</a></li>\n<li><a href=\"#%E8%AE%A1%E7%AE%97%E6%96%B9%E5%BC%8F\">计算方式</a></li>\n</ul>\n</li>\n<li><a href=\"#unicode\">Unicode</a>\n<ul>\n<li><a href=\"#%E6%A6%82%E5%BF%B5-2\">概念</a></li>\n<li><a href=\"#%E7%BB%84%E6%88%90-3\">组成</a></li>\n<li><a href=\"#%E7%97%9B%E7%82%B9\">痛点</a></li>\n<li><a href=\"#utf-8\">UTF-8</a>\n<ul>\n<li><a href=\"#%E5%AE%9E%E4%BE%8B-%E8%AE%B0%E4%BA%8B%E6%9C%AC\">实例 - 记事本</a></li>\n<li><a href=\"#%E5%AE%9E%E4%BE%8B-%E6%B5%8F%E8%A7%88%E5%99%A8\">实例 - 浏览器</a></li>\n</ul>\n</li>\n<li><a href=\"#utf-32\">UTF-32</a></li>\n<li><a href=\"#utf-16\">UTF-16</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E6%96%87%E4%BB%B6\">文件</a>\n<ul>\n<li><a href=\"#%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6\">文本文件</a></li>\n<li><a href=\"#%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E4%BB%B6\">二进制文件</a>\n<ul>\n<li><a href=\"#%E4%BC%98%E5%8A%BF\">优势</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%AF%B9%E6%AF%94\">对比</a>\n<ul>\n<li><a href=\"#%E7%9B%B8%E5%90%8C\">相同</a></li>\n<li><a href=\"#%E4%B8%8D%E5%90%8C\">不同</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE\">参考文献</a></li>\n</ul>\n</li>\n</ul>\n","date":"2019-07-31 21:16:31","dateFormat":"2019-07-31"},{"fileName":"proxy","abstract":"<blockquote>\n<ul>\n<li>源于师姐提到的一个问题：什么是反向代理？</li>\n<li>之前本科在自己建站以及做学校项目的时候其实有涉及到，但没进行总结</li>\n<li>趁此机会埋个坑，把代理的东西好好理一理，顺便讲讲 VPN 啥的</li>\n<li>未完待续~</li>\n</ul>\n</blockquote>\n","description":" 源于师姐提到的一个问题：什么是反向代理？ 之前本科在自己建站以及做学校项目的时候其实有涉及到，但没进行总结 趁此机会埋个坑，把代理的东西好好理一理，顺便讲讲 VPN 啥的 未完待续~ 基本概念 什么是代理？ 代理：顾名思义，根据...","title":"网络代理基础","tags":[{"name":"网络","slug":"ZqEqvRTvl","used":true,"link":"https://blog.shunzi.tech/tag/ZqEqvRTvl/"}],"feature":"https://www.ionos.ca/digitalguide/fileadmin/DigitalGuide/Teaser/proxy-t.jpg","link":"https://blog.shunzi.tech/post/proxy/","stats":{"text":"13 min read","time":733000,"words":3285,"minutes":13},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5\">基本概念</a>\n<ul>\n<li><a href=\"#%E4%BB%80%E4%B9%88%E6%98%AF%E4%BB%A3%E7%90%86\">什么是代理？</a></li>\n<li><a href=\"#%E7%BD%91%E7%BB%9C%E4%BB%A3%E7%90%86\">网络代理</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%B8%B8%E8%A7%81%E7%B1%BB%E5%9E%8B\">常见类型</a>\n<ul>\n<li><a href=\"#%E6%AD%A3%E5%90%91%E4%BB%A3%E7%90%86forward-proxy\">正向代理（Forward Proxy）</a>\n<ul>\n<li><a href=\"#%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86\">基本原理</a></li>\n<li><a href=\"#%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF\">使用场景</a></li>\n<li><a href=\"#%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F\">实现方式</a></li>\n<li><a href=\"#%E5%BB%B6%E7%94%B3\">延申</a></li>\n<li><a href=\"#%E5%B8%B8%E8%A7%81%E6%AD%A3%E5%90%91%E4%BB%A3%E7%90%86%E8%BD%AF%E4%BB%B6\">常见正向代理软件</a>\n<ul>\n<li><a href=\"#tinyproxy\">tinyproxy</a></li>\n<li><a href=\"#gost\">gost</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86\">反向代理</a>\n<ul>\n<li><a href=\"#%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86-2\">基本原理</a></li>\n<li><a href=\"#%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF-2\">使用场景</a></li>\n<li><a href=\"#%E5%BB%B6%E7%94%B3-2\">延申</a>\n<ul>\n<li><a href=\"#ssh\">ssh</a>\n<ul>\n<li><a href=\"#%E5%9C%BA%E6%99%AF\">场景</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#last-but-not-least-%E7%8C%B4%E5%AD%90%E9%83%BD%E8%83%BD%E7%9C%8B%E6%87%82%E7%9A%84%E6%AD%A5%E9%AA%A4\">Last but not least (猴子都能看懂的步骤)</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE\">参考文献</a></li>\n</ul>\n</li>\n</ul>\n","date":"2019-07-27 00:09:50","dateFormat":"2019-07-27"},{"fileName":"heelo-diary","abstract":"<blockquote>\n<ul>\n<li>Diary 开始篇，大概也不能叫 Diary.</li>\n<li>主要记录一些<s>咸鱼日常</s>观点以及<s>胡言乱语</s>灵感</li>\n<li>好吧，其实是为了打发晚上无聊的时光</li>\n</ul>\n</blockquote>\n","description":" Diary 开始篇，大概也不能叫 Diary. 主要记录一些咸鱼日常观点以及胡言乱语灵感 好吧，其实是为了打发晚上无聊的时光 （写在前面：不知道如果不用 Markdown 会是什么样的排版效果，所以第一篇应该很乱）...","title":"Hello Diary","tags":[{"index":-1,"name":"Diary","slug":"diary","used":true,"link":"https://blog.shunzi.tech/tag/diary/"}],"feature":"https://github.com/zjs1224522500/files-and-images/blob/master/blog/pic/diary/23-00-HUST.jpg?raw=true","link":"https://blog.shunzi.tech/post/heelo-diary/","stats":{"text":"4 min read","time":196000,"words":965,"minutes":4},"isTop":false,"toc":"","date":"2019-07-25 23:59:49","dateFormat":"2019-07-25"},{"fileName":"cmake","abstract":"<blockquote>\n<ul>\n<li>构建工具 CMake 介绍</li>\n<li>官方入门教程翻译</li>\n<li>后续增加部分高级功能实现</li>\n</ul>\n</blockquote>\n","description":" 构建工具 CMake 介绍 官方入门教程翻译 后续增加部分高级功能实现 CMake 背景 你或许听过好几种 Make 工具，例如 GNU Make ，QT 的 qmake ，微软的 MS nmake，BSD Make（pmak...","title":"CMake入门","tags":[{"name":"C语言","slug":"5h7k39FKw","used":true,"link":"https://blog.shunzi.tech/tag/5h7k39FKw/"},{"name":"工具","slug":"hbaTDSglx-","used":true,"link":"https://blog.shunzi.tech/tag/hbaTDSglx-/"}],"feature":"https://cmake.org/wp-content/uploads/2018/11/cmake_logo_slider.png","link":"https://blog.shunzi.tech/post/cmake/","stats":{"text":"21 min read","time":1230000,"words":4582,"minutes":21},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#cmake\">CMake</a>\n<ul>\n<li><a href=\"#%E8%83%8C%E6%99%AF\">背景</a></li>\n<li><a href=\"#%E6%B5%81%E7%A8%8B\">流程</a></li>\n<li><a href=\"#%E5%AE%9E%E4%BE%8B\">实例</a>\n<ul>\n<li><a href=\"#step-1-%E5%9F%BA%E6%9C%AC%E7%9A%84cmakeliststxt\">Step 1. 基本的CMakeLists.txt</a></li>\n<li><a href=\"#step-2-%E5%AF%BC%E5%85%A5%E5%BA%93%E6%96%87%E4%BB%B6\">Step 2. 导入库文件</a></li>\n<li><a href=\"#step-3-%E5%AE%89%E8%A3%85%E5%92%8C%E6%B5%8B%E8%AF%95\">Step 3. 安装和测试</a></li>\n<li><a href=\"#step-4-%E6%B7%BB%E5%8A%A0%E7%B3%BB%E7%BB%9F%E8%87%AA%E6%A3%80\">Step 4. 添加系统自检</a></li>\n<li><a href=\"#step-5-%E6%B7%BB%E5%8A%A0%E4%B8%80%E4%B8%AA%E7%94%9F%E6%88%90%E7%9A%84%E6%96%87%E4%BB%B6%E5%92%8C%E7%94%9F%E6%88%90%E5%99%A8\">Step 5. 添加一个生成的文件和生成器</a></li>\n</ul>\n</li>\n<li><a href=\"#step-6-%E6%9E%84%E9%80%A0%E4%B8%80%E4%B8%AA-installer\">Step 6. 构造一个 Installer</a></li>\n<li><a href=\"#step-7-%E6%B7%BB%E5%8A%A0-dashboard-%E6%94%AF%E6%8C%81\">Step 7. 添加 Dashboard 支持</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%AE%9E%E4%BE%8B-2\">实例</a>\n<ul>\n<li><a href=\"#1%E7%BC%96%E8%AF%91%E7%94%9F%E6%88%90%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6\">1.编译生成可执行文件</a></li>\n<li><a href=\"#2%E5%8A%A8%E6%80%81%E5%BA%93%E9%9D%99%E6%80%81%E5%BA%93-%E7%BC%96%E8%AF%91\">2.动态库/静态库 编译</a>\n<ul>\n<li><a href=\"#%E9%A1%B9%E7%9B%AE%E6%A0%B9%E7%9B%AE%E5%BD%95%E4%B8%8B%E7%9A%84-cmakeliststxt\">项目根目录下的 CMakeLists.txt</a></li>\n<li><a href=\"#src-%E7%9B%AE%E5%BD%95%E4%B8%8B%E7%9A%84-cmakeliststxt\">src 目录下的 CMakeLists.txt</a></li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE\">参考文献</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2019-07-22 19:22:53","dateFormat":"2019-07-22"},{"fileName":"storage-basic-concept","abstract":"<blockquote>\n<ul>\n<li>存储的一些基本概念</li>\n<li>一些专业的术语解释</li>\n<li>持续更新ing</li>\n</ul>\n</blockquote>\n","description":" 存储的一些基本概念 一些专业的术语解释 持续更新ing 从逻辑上存储通常分为块存储，文件存储，对象存储。 存储分类及应用 块存储：块存储（DAS/SAN）通常应用在某些专有的系统中，这类应用要求很高的随机读写性能和高可靠性，...","title":"存储基本概念","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"}],"feature":"https://pic.36krcnd.com/201804/20060915/yucn8kelclf6k0hj!1200","link":"https://blog.shunzi.tech/post/storage-basic-concept/","stats":{"text":"35 min read","time":2058000,"words":9678,"minutes":35},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li>\n<ul>\n<li><a href=\"#%E5%AD%98%E5%82%A8%E5%88%86%E7%B1%BB%E5%8F%8A%E5%BA%94%E7%94%A8\">存储分类及应用</a>\n<ul>\n<li><a href=\"#%E5%BA%94%E7%94%A8\">应用</a>\n<ul>\n<li><a href=\"#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE\">参考文献</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#raid-redundant-array-of-independent-disks\">RAID (Redundant Array of Independent Disks)</a>\n<ul>\n<li><a href=\"#raid0-%E6%9D%A1%E5%B8%A6%E5%8C%96\">RAID0 条带化</a></li>\n<li><a href=\"#raid1-%E9%95%9C%E5%83%8F\">RAID1 镜像</a></li>\n<li><a href=\"#raid2-2n%E6%B5%B7%E6%98%8E%E7%A0%81%E6%A0%A1%E9%AA%8C\">RAID2 2n海明码校验</a></li>\n<li><a href=\"#raid3-%E6%A0%A1%E9%AA%8C%E7%9B%98\">RAID3 校验盘</a></li>\n<li><a href=\"#raid4-%E5%9D%97%E7%BB%84%E7%BB%87%E6%A0%A1%E9%AA%8C%E7%9B%98\">RAID4 块组织校验盘</a></li>\n<li><a href=\"#raid5-%E6%A0%A1%E9%AA%8C%E6%95%B0%E6%8D%AE%E6%95%A3%E5%88%97%E5%88%86%E5%B8%83\">RAID5 校验数据散列分布</a></li>\n<li><a href=\"#raid6-%E6%A0%A1%E9%AA%8C%E6%95%B0%E6%8D%AE%E5%86%97%E4%BD%99%E5%88%86%E5%B8%83-%E5%8F%8C%E9%87%8D%E6%A0%A1%E9%AA%8C\">RAID6 校验数据冗余分布 双重校验</a></li>\n<li><a href=\"#raid00-raid01-raid10-raid100-raid30-raid50-raid53-raid60\">RAID00  RAID01  RAID10  RAID100  RAID30  RAID50  RAID53  RAID60</a>\n<ul>\n<li><a href=\"#raid01-%E5%92%8C-raid10\">RAID01 和 RAID10</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\">参考链接</a></li>\n</ul>\n</li>\n<li><a href=\"#rom-read-only-memory\">ROM (Read Only Memory)</a>\n<ul>\n<li><a href=\"#rom\">ROM</a></li>\n<li><a href=\"#prom\">PROM</a></li>\n<li><a href=\"#eprom\">EPROM</a></li>\n<li><a href=\"#otprom\">OTPROM</a></li>\n<li><a href=\"#eeprom\">EEPROM</a></li>\n<li><a href=\"#flash\">FLASH</a>\n<ul>\n<li><a href=\"#nor-flash\">NOR Flash</a></li>\n<li><a href=\"#nand-flash\">NAND Flash</a></li>\n<li><a href=\"#emmc\">EMMC</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#ram-random-access-memory\">RAM (Random Access Memory)</a>\n<ul>\n<li><a href=\"#sram-static-random-access-memory\">SRAM (Static Random Access Memory)</a></li>\n<li><a href=\"#dram-dynamic-random-access-memory\">DRAM (Dynamic Random Access Memory)</a>\n<ul>\n<li><a href=\"#sdram-%E5%90%8C%E6%AD%A5%E5%8A%A8%E6%80%81%E9%9A%8F%E6%9C%BA%E5%AD%98%E5%8F%96%E5%85%A7%E5%AD%98synchronous-dynamic-random-access-memory\">SDRAM 同步动态随机存取內存（synchronous dynamic random-access memory）</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#ssd-solid-state-drive\">SSD (Solid-State Drive)</a>\n<ul>\n<li><a href=\"#%E6%98%93%E5%A4%B1%E6%80%A7%E5%AD%98%E5%82%A8%E5%99%A8\">易失性存储器</a></li>\n<li><a href=\"#%E9%9D%9E%E6%98%93%E5%A4%B1%E6%80%A7%E5%AD%98%E5%82%A8%E5%99%A8\">非易失性存储器</a>\n<ul>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5-2\">参考链接</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#iscsi-internet-small-computer-system-interface\">iSCSI (Internet Small Computer System Interface)</a>\n<ul>\n<li><a href=\"#scsi-small-computer-system-interface\">SCSI (Small Computer System Interface)</a></li>\n<li><a href=\"#san-storage-area-network\">SAN (Storage Area Network)</a></li>\n<li><a href=\"#iscsi%E7%9A%84%E4%BD%BF%E7%94%A8\">iSCSI的使用</a>\n<ul>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5-3\">参考链接</a></li>\n</ul>\n</li>\n<li><a href=\"#lvm-logical-volumn-manager\">LVM (Logical Volumn Manager)</a>\n<ul>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5-4\">参考链接</a></li>\n</ul>\n</li>\n<li><a href=\"#%E7%A3%81%E7%9B%98%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86\">磁盘基础知识</a>\n<ul>\n<li><a href=\"#%E5%9D%97%E7%B0%87-%E5%A4%96%E5%AD%98\">块/簇 -&gt; 外存</a></li>\n<li><a href=\"#%E9%A1%B5-%E5%86%85%E5%AD%98\">页 -&gt; 内存</a></li>\n<li><a href=\"#%E6%80%BB%E7%BB%93\">总结</a></li>\n</ul>\n</li>\n<li><a href=\"#%E7%A3%81%E7%9B%98%E5%88%86%E5%8C%BA\">磁盘分区</a>\n<ul>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5-5\">参考链接</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2019-07-20 22:06:13","dateFormat":"2019-07-20"},{"fileName":"tcmu","abstract":"<blockquote>\n<ul>\n<li>iSCSI Target 端的用户态实现 TCMU 介绍</li>\n<li>TCMU 原理剖析</li>\n<li>TCMU 对接自定义后端存储代码示例讲解</li>\n</ul>\n</blockquote>\n","description":" iSCSI Target 端的用户态实现 TCMU 介绍 TCMU 原理剖析 TCMU 对接自定义后端存储代码示例讲解 TCMU 简介 TCMU 优势 设计约束 实现概览 MailBox Command Ring T...","title":"TCMU学习笔记","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"Linux","slug":"EO3XpMf_y","used":true,"link":"https://blog.shunzi.tech/tag/EO3XpMf_y/"}],"feature":"https://github.com/zjs1224522500/files-and-images/blob/master/blog/pic/TCMU-LIO.png?raw=true","link":"https://blog.shunzi.tech/post/tcmu/","stats":{"text":"28 min read","time":1669000,"words":5291,"minutes":28},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li>\n<ul>\n<li><a href=\"#tcmu-%E7%AE%80%E4%BB%8B\">TCMU 简介</a></li>\n<li><a href=\"#tcmu-%E4%BC%98%E5%8A%BF\">TCMU 优势</a></li>\n<li><a href=\"#%E8%AE%BE%E8%AE%A1%E7%BA%A6%E6%9D%9F\">设计约束</a></li>\n<li><a href=\"#%E5%AE%9E%E7%8E%B0%E6%A6%82%E8%A7%88\">实现概览</a>\n<ul>\n<li><a href=\"#mailbox\">MailBox</a></li>\n<li><a href=\"#command-ring\">Command Ring</a>\n<ul>\n<li><a href=\"#tcmu_op_cmd\">TCMU_OP_CMD</a></li>\n<li><a href=\"#tcmu_op_pad\">TCMU_OP_PAD</a></li>\n</ul>\n</li>\n<li><a href=\"#data-area\">Data Area</a></li>\n</ul>\n</li>\n<li><a href=\"#tcmu-%E5%8A%A8%E6%80%81%E9%85%8D%E7%BD%AE%E5%8A%A0%E8%BD%BD\">TCMU 动态配置加载</a></li>\n<li><a href=\"#tcmu-plugin-handler\">TCMU Plugin Handler</a>\n<ul>\n<li><a href=\"#%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F%E4%B8%80-%E5%85%A8%E6%9D%83%E6%8E%A5%E7%AE%A1%E5%91%BD%E4%BB%A4%E5%A4%84%E7%90%86\">实现方式一  全权接管命令处理</a></li>\n<li><a href=\"#%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F%E4%BA%8C-%E4%BB%85%E5%AE%9E%E7%8E%B0%E5%85%B7%E4%BD%93%E7%9A%84io%E6%93%8D%E4%BD%9C\">实现方式二  仅实现具体的IO操作</a></li>\n</ul>\n</li>\n<li><a href=\"#tcmu-%E6%B7%B1%E5%85%A5\">TCMU 深入</a>\n<ul>\n<li><a href=\"#targetcli-fb\">targetcli-fb</a>\n<ul>\n<li><a href=\"#rtslib-fb\">rtslib-fb</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2019-07-17 14:58:46","dateFormat":"2019-07-17"},{"fileName":"cinder","abstract":"<blockquote>\n<ul>\n<li>OpenStack 存储调度管理基础设施 Cinder 组件介绍</li>\n<li>Cinder 核心流程和实现方式</li>\n<li>Cinder 高可用架构实现方式</li>\n</ul>\n</blockquote>\n","description":" OpenStack 存储调度管理基础设施 Cinder 组件介绍 Cinder 核心流程和实现方式 Cinder 高可用架构实现方式 Cinder 主要模块 cinder-api 核心思想 核心流程 细节 CRUD...","title":"Cinder核心","tags":[{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/"},{"name":"云计算","slug":"4zx4ysLGro","used":true,"link":"https://blog.shunzi.tech/tag/4zx4ysLGro/"},{"name":"OpenStack","slug":"oqE3oKihb","used":true,"link":"https://blog.shunzi.tech/tag/oqE3oKihb/"}],"feature":"https://docs.openstack.org/cinder/latest/_images/cinder.png","link":"https://blog.shunzi.tech/post/cinder/","stats":{"text":"23 min read","time":1324000,"words":4772,"minutes":23},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li>\n<ul>\n<li><a href=\"#cinder\">Cinder</a>\n<ul>\n<li><a href=\"#%E4%B8%BB%E8%A6%81%E6%A8%A1%E5%9D%97\">主要模块</a>\n<ul>\n<li><a href=\"#cinder-api\">cinder-api</a>\n<ul>\n<li><a href=\"#%E6%A0%B8%E5%BF%83%E6%80%9D%E6%83%B3\">核心思想</a></li>\n<li><a href=\"#%E6%A0%B8%E5%BF%83%E6%B5%81%E7%A8%8B\">核心流程</a></li>\n<li><a href=\"#%E7%BB%86%E8%8A%82\">细节</a></li>\n<li><a href=\"#crud-of-cinder-volumn\">CRUD of Cinder Volumn</a></li>\n<li><a href=\"#crud-of-cinder-volumn-metadata\">CRUD of Cinder Volumn metadata</a></li>\n<li><a href=\"#volume-manage-extension-manageable_volumes\">Volume manage extension (manageable_volumes)¶</a></li>\n<li><a href=\"#volume-transfer\">Volume transfer</a></li>\n<li><a href=\"#services-os-services\">Services (os-services)¶</a></li>\n<li><a href=\"#volume-actions-volumes-action\">Volume actions (volumes, action)¶</a></li>\n<li><a href=\"#generic-volume-groups\">Generic volume groups</a></li>\n</ul>\n</li>\n<li><a href=\"#cinder-scheduler\">cinder-scheduler</a></li>\n<li><a href=\"#cinder-volume\">cinder-volume</a>\n<ul>\n<li><a href=\"#cinder-volumn-driver\">cinder-volumn Driver</a></li>\n</ul>\n</li>\n<li><a href=\"#cinder-volumn-plugin\">cinder-volumn Plugin</a></li>\n<li><a href=\"#cinder-backup\">cinder-backup</a></li>\n</ul>\n</li>\n<li><a href=\"#cinder-ha-cinder-%E9%AB%98%E5%8F%AF%E7%94%A8\">Cinder HA (Cinder 高可用)</a></li>\n<li><a href=\"#cinder%E7%9A%84%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81\">Cinder的分布式锁</a>\n<ul>\n<li><a href=\"#%E6%9C%AC%E5%9C%B0%E9%94%81\">本地锁</a></li>\n<li><a href=\"#tooz\">Tooz</a></li>\n</ul>\n</li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\">参考链接</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2019-07-16 22:09:11","dateFormat":"2019-07-16"},{"fileName":"rabbitmq","abstract":"<blockquote>\n<ul>\n<li>Introduce the RabbitMQ.</li>\n<li>Write some example code.</li>\n<li>Refer the official document.</li>\n</ul>\n</blockquote>\n","description":" Introduce the RabbitMQ. Write some example code. Refer the official document. Introduction * RabbitMQ is a ...","title":"RabbitMQ","tags":[{"name":"中间件","slug":"p_z7gKe6R","used":true,"link":"https://blog.shunzi.tech/tag/p_z7gKe6R/"}],"feature":"https://github.com/zjs1224522500/files-and-images/blob/master/blog/pic/rabbitmq-cover.png?raw=true","link":"https://blog.shunzi.tech/post/rabbitmq/","stats":{"text":"21 min read","time":1255000,"words":3357,"minutes":21},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li>\n<ul>\n<li>\n<ul>\n<li><a href=\"#introduction\">Introduction</a><br>\n*\n<ul>\n<li><a href=\"#rabbitmq-is-a-message-broker%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6\">RabbitMQ is a message broker（消息中间件）:</a></li>\n</ul>\n</li>\n<li><a href=\"#brief-model-product-consume-model\">Brief model (Product-Consume-Model)</a>\n<ul>\n<li><a href=\"#produce\">Produce</a></li>\n<li><a href=\"#consume\">Consume</a></li>\n</ul>\n</li>\n<li><a href=\"#start-with-hellorabbitmq\">Start with &quot;Hello,RabbitMQ&quot;</a>\n<ul>\n<li><a href=\"#1-simple-send-and-receive-with-named-queue\">1. Simple Send And Receive with Named Queue</a></li>\n<li><a href=\"#2-distribute-time-consuming-tasks-among-multiple-workers\">2. Distribute time-consuming tasks among multiple workers</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#publishsubscribe\">Publish/Subscribe</a>\n<ul>\n<li><a href=\"#introduction-2\">Introduction</a></li>\n<li><a href=\"#full-message-model-in-rabbit\">Full Message Model in Rabbit</a>\n<ul>\n<li><a href=\"#previous-model\">Previous model</a>\n<ul>\n<li><a href=\"#problems-existed\">Problems existed:</a></li>\n</ul>\n</li>\n<li><a href=\"#new-model\">New Model</a>\n<ul>\n<li><a href=\"#example-of-fanout-exchange\">Example of Fanout Exchange</a></li>\n<li><a href=\"#example-of-direct-exchange\">Example of Direct Exchange</a></li>\n<li><a href=\"#example-of-topic-exchange\">Example of Topic Exchange</a></li>\n<li><a href=\"#relationship-between-different-exchange\">Relationship between Different Exchange</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#header-exchange\">Header Exchange</a></li>\n<li><a href=\"#rpc-system-with-rabbit-mq\">RPC system with Rabbit MQ</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2019-07-14 15:09:45","dateFormat":"2019-07-14"},{"fileName":"how-to-develop-test","abstract":"<blockquote>\n<ul>\n<li>测试开发</li>\n<li>结合实际例子介绍相关测试框架的使用</li>\n<li>Findbugs, Fortify，SonarQube，PMD也会做简单介绍</li>\n</ul>\n</blockquote>\n","description":" 测试开发 结合实际例子介绍相关测试框架的使用 Findbugs, Fortify，SonarQube，PMD也会做简单介绍 单元测试 Unit Test (UT) * JUnit4/5 Mockito How serv...","title":"教你写测试","tags":[{"index":-1,"name":"测试","slug":"Test","used":true,"link":"https://blog.shunzi.tech/tag/Test/"},{"index":-1,"name":"Product Standard","slug":"Product-Standard","used":true,"link":"https://blog.shunzi.tech/tag/Product-Standard/"}],"feature":"https://thejournal.com/~/media/EDU/THEJournal/Images/2015/02/20150224test644.jpg","link":"https://blog.shunzi.tech/post/how-to-develop-test/","stats":{"text":"13 min read","time":736000,"words":2317,"minutes":13},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95-unit-test-ut\">单元测试 Unit Test (UT)</a><br>\n*\n<ul>\n<li><a href=\"#junit45\">JUnit4/5</a></li>\n<li><a href=\"#mockito\">Mockito</a></li>\n<li><a href=\"#how\">How</a>\n<ul>\n<li><a href=\"#servicedao-unit-test\">service/dao unit test</a></li>\n</ul>\n</li>\n<li><a href=\"#springtest\">SpringTest</a>\n<ul>\n<li><a href=\"#mockmvc-unit-test\">mockMvc unit test</a></li>\n</ul>\n</li>\n<li><a href=\"#powermock\">PowerMock</a>\n<ul>\n<li><a href=\"#how-to-use\">How to use:</a></li>\n<li><a href=\"#caution\">Caution:</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E9%9B%86%E6%88%90%E6%B5%8B%E8%AF%95-integration-test-it\">集成测试 Integration Test (IT)</a><br>\n*\n<ul>\n<li><a href=\"#spring-integration-test\">Spring Integration Test</a></li>\n<li><a href=\"#prepare\">Prepare:</a></li>\n<li><a href=\"#%E4%BB%A3%E7%A0%81%E5%AE%9E%E4%BE%8B\">代码实例：</a></li>\n</ul>\n</li>\n<li><a href=\"#%E7%B3%BB%E7%BB%9F%E6%B5%8B%E8%AF%95-system-test-st\">系统测试 System Test (ST)</a>\n<ul>\n<li><a href=\"#jmeter\">JMeter</a>\n<ul>\n<li><a href=\"#download-and-launch\">Download and Launch</a></li>\n<li><a href=\"#how-to-use-jmeter\">How to use JMeter</a></li>\n<li><a href=\"#example-code\">Example Code</a></li>\n<li><a href=\"#head-first\">Head First</a>\n<ul>\n<li><a href=\"#step-1-create-thread-group\">Step 1. Create Thread Group</a></li>\n<li><a href=\"#step-2-define-some-common-variables\">Step 2. Define some common variables</a></li>\n<li><a href=\"#step-3-new-http-request\">Step 3. New Http Request</a></li>\n<li><a href=\"#step-4-new-assertersjson-assertion-response-assertion-etc\">Step 4. New Asserters.(JSON Assertion, Response Assertion etc.)</a></li>\n<li><a href=\"#step-5-processor-prepost\">Step 5. Processor (Pre/Post)</a></li>\n<li><a href=\"#step-6-result-tree\">Step 6. Result Tree</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95auto-ui-test\">自动化测试（Auto UI Test）</a>\n<ul>\n<li><a href=\"#katalon-studio\">Katalon Studio</a></li>\n<li><a href=\"#groovy-based-on-java\">Groovy (Based on Java)</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2019-05-24 14:13:24","dateFormat":"2019-05-24"},{"fileName":"spring-event","abstract":"<blockquote>\n<ul>\n<li>Introduce the Event in Spring.</li>\n<li>Explore the core concept in Spring Event.</li>\n<li>At the same time, introduce the design pattern Observer</li>\n</ul>\n</blockquote>\n","description":" Introduce the Event in Spring. Explore the core concept in Spring Event. At the same time, introduce the design patter...","title":"Spring Event","tags":[{"name":"Spring","slug":"spring","used":true,"link":"https://blog.shunzi.tech/tag/spring/"},{"name":"设计模式","slug":"she-ji-mo-shi","used":true,"link":"https://blog.shunzi.tech/tag/she-ji-mo-shi/"}],"feature":"http://www.spring-event.com/wp-content/uploads/2017/11/logo.png","link":"https://blog.shunzi.tech/post/spring-event/","stats":{"text":"9 min read","time":516000,"words":1376,"minutes":9},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#spring-event\">Spring Event</a>\n<ul>\n<li><a href=\"#observer-design-pattern\">Observer Design Pattern</a>\n<ul>\n<li><a href=\"#scenario\">Scenario</a></li>\n<li><a href=\"#design\">Design</a>\n<ul>\n<li><a href=\"#model\">Model</a></li>\n<li><a href=\"#abstract\">Abstract</a></li>\n</ul>\n</li>\n<li><a href=\"#source-code\">Source code</a>\n<ul>\n<li><a href=\"#companyjavanotifyobserver\">Company.java#notifyObserver()</a></li>\n<li><a href=\"#employeejavatakeactionstring-msg\">Employee.java#takeAction(String msg)</a></li>\n</ul>\n</li>\n<li><a href=\"#differences-with-publish-subscribe\">Differences with Publish-Subscribe</a></li>\n</ul>\n</li>\n<li><a href=\"#spring-events\">Spring Events</a>\n<ul>\n<li><a href=\"#event-publisher\">Event Publisher</a>\n<ul>\n<li><a href=\"#1-domainevents-spring-data-jpa\">1. @DomainEvents  - Spring Data JPA</a></li>\n<li><a href=\"#2-mannual-publish\">2. Mannual Publish</a></li>\n</ul>\n</li>\n<li><a href=\"#event-listener\">Event Listener</a>\n<ul>\n<li><a href=\"#1-eventlistener\">1. @EventListener</a></li>\n<li><a href=\"#2-transactioneventlistener\">2. @TransactionEventListener</a></li>\n</ul>\n</li>\n<li><a href=\"#explore\">Explore</a>\n<ul>\n<li><a href=\"#how-to-event-process-method-in-listener-class\">How to event process method in listener class</a></li>\n<li><a href=\"#where-to-call-method-multicastevent\">Where to call method multicastEvent()</a></li>\n<li><a href=\"#reference\">Reference :</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2018-11-01 00:09:11","dateFormat":"2018-11-01"},{"fileName":"design-pattern-factory","abstract":"<blockquote>\n<ul>\n<li>代码不完全参照原书 , 借鉴书中相关例子和部分概念</li>\n<li>顺序部分参考原书，部分引用原书 UML 类图，会结合实际应用描述优缺点</li>\n<li>工厂模式（简单工厂模式，工厂方法模式，抽象工厂模式）</li>\n</ul>\n</blockquote>\n","description":" 代码不完全参照原书 , 借鉴书中相关例子和部分概念 顺序部分参考原书，部分引用原书 UML 类图，会结合实际应用描述优缺点 工厂模式（简单工厂模式，工厂方法模式，抽象工厂模式） 工厂模式 概念理解 工厂：主要负责对象的创建。其中...","title":"设计模式之工厂模式","tags":[{"name":"设计模式","slug":"she-ji-mo-shi","used":true,"link":"https://blog.shunzi.tech/tag/she-ji-mo-shi/"}],"feature":"","link":"https://blog.shunzi.tech/post/design-pattern-factory/","stats":{"text":"10 min read","time":581000,"words":2141,"minutes":10},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li>\n<ul>\n<li><a href=\"#%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F\">工厂模式</a>\n<ul>\n<li><a href=\"#%E6%A6%82%E5%BF%B5%E7%90%86%E8%A7%A3\">概念理解</a></li>\n<li><a href=\"#%E5%AE%9E%E4%BE%8B%E8%AE%B2%E8%A7%A3\">实例讲解</a>\n<ul>\n<li><a href=\"#%E5%9C%BA%E6%99%AF\">场景：</a></li>\n<li><a href=\"#%E5%B8%B8%E8%A7%84%E5%AE%9E%E7%8E%B0\">常规实现：</a></li>\n<li><a href=\"#%E7%AE%80%E5%8D%95%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F\">简单工厂模式：</a></li>\n<li><a href=\"#%E5%B7%A5%E5%8E%82%E6%96%B9%E6%B3%95%E6%A8%A1%E5%BC%8F\">工厂方法模式</a></li>\n<li><a href=\"#%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F\">抽象工厂模式</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2018-08-18 16:55:55","dateFormat":"2018-08-18"},{"fileName":"learn-spring-data-jpa","abstract":"<blockquote>\n<ul>\n<li>此篇博文主要是结合官方文档以及对JPA的一些使用进行记录。</li>\n<li>对于相关介绍，可参考相应博客。</li>\n<li>后续会对相关实现机制和核心思想进行深入探讨。</li>\n</ul>\n</blockquote>\n","description":" 此篇博文主要是结合官方文档以及对JPA的一些使用进行记录。 对于相关介绍，可参考相应博客。 后续会对相关实现机制和核心思想进行深入探讨。 参考书目： 汪云飞：JavaEE开发的颠覆者 Spring Boot实战 参考博客： ...","title":"SpringData-JPA","tags":[{"name":"Spring","slug":"spring","used":true,"link":"https://blog.shunzi.tech/tag/spring/"}],"feature":"","link":"https://blog.shunzi.tech/post/learn-spring-data-jpa/","stats":{"text":"13 min read","time":751000,"words":2554,"minutes":13},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li>\n<ul>\n<li>\n<ul>\n<li><a href=\"#%E5%8F%82%E8%80%83%E4%B9%A6%E7%9B%AE\">参考书目：</a></li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E5%8D%9A%E5%AE%A2\">参考博客：</a></li>\n<li><a href=\"#%E5%8F%82%E8%80%83%E6%96%87%E6%A1%A3\">参考文档：</a></li>\n</ul>\n</li>\n<li><a href=\"#%E7%9B%B8%E5%85%B3%E4%BD%BF%E7%94%A8\">相关使用</a>\n<ul>\n<li><a href=\"#1-%E5%BC%95%E5%85%A5%E4%BE%9D%E8%B5%96\">1、引入依赖</a></li>\n<li><a href=\"#2-%E5%BB%BA%E7%AB%8B%E6%95%B0%E6%8D%AE%E8%AE%BF%E9%97%AE%E5%B1%82\">2、建立数据访问层</a>\n<ul>\n<li><a href=\"#repository-%E7%9A%84%E7%9B%B8%E5%85%B3%E5%AD%90%E7%B1%BB%E5%AE%9E%E7%8E%B0\">Repository 的相关子类实现</a>\n<ul>\n<li><a href=\"#%E8%87%AA%E5%B8%A6repository\">自带Repository</a></li>\n<li><a href=\"#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8A%BD%E8%B1%A1-repository\">自定义抽象 Repository</a></li>\n</ul>\n</li>\n<li><a href=\"#2-jpa%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8-4-steps\">2、JPA的基本使用: 4 steps</a>\n<ul>\n<li><a href=\"#1-%E5%BB%BA%E7%AB%8B%E7%9B%B8%E5%85%B3%E6%8E%A5%E5%8F%A3-two-steps\">1)、建立相关接口 two steps</a></li>\n<li><a href=\"#2-%E5%9C%A8-spring-%E4%B8%AD%E4%B8%BA%E5%AE%9A%E4%B9%89%E5%A5%BD%E7%9A%84%E6%8E%A5%E5%8F%A3%E5%88%9B%E5%BB%BA%E4%BB%A3%E7%90%86%E5%AE%9E%E4%BE%8B\">2)、在 Spring 中为定义好的接口创建代理实例</a></li>\n<li><a href=\"#3-%E8%8E%B7%E5%8F%96-repository-%E5%AE%9E%E4%BE%8B%E5%B9%B6%E8%B0%83%E7%94%A8%E7%9B%B8%E5%85%B3%E6%96%B9%E6%B3%95\">3)、获取 Repository 实例并调用相关方法</a></li>\n</ul>\n</li>\n<li><a href=\"#3-%E5%AE%9A%E4%B9%89%E6%9F%A5%E8%AF%A2%E6%96%B9%E6%B3%95\">3、定义查询方法</a>\n<ul>\n<li><a href=\"#1-%E6%9F%A5%E8%AF%A2%E7%AD%96%E7%95%A5\">1）、查询策略</a></li>\n<li><a href=\"#2-%E5%B1%9E%E6%80%A7%E8%A1%A8%E8%BE%BE%E5%BC%8F\">2）、属性表达式</a></li>\n<li><a href=\"#3-%E7%89%B9%E6%AE%8A%E5%8F%82%E6%95%B0%E5%A4%84%E7%90%86pageablesort\">3）、特殊参数处理（Pageable,Sort）</a></li>\n<li><a href=\"#4-%E9%99%90%E5%88%B6%E6%9F%A5%E8%AF%A2%E7%BB%93%E6%9E%9C\">4）、限制查询结果</a></li>\n<li><a href=\"#5-%E6%B5%81%E5%BC%8F%E6%9F%A5%E8%AF%A2%E7%BB%93%E6%9E%9C\">5）、流式查询结果</a></li>\n<li><a href=\"#6-%E5%BC%82%E6%AD%A5%E6%9F%A5%E8%AF%A2%E7%BB%93%E6%9E%9C\">6）、异步查询结果</a></li>\n</ul>\n</li>\n<li><a href=\"#4-%E5%88%9B%E5%BB%BA-repo-%E5%AE%9E%E4%BE%8B\">4、创建 Repo 实例</a>\n<ul>\n<li><a href=\"#1-xml-%E9%85%8D%E7%BD%AE\">1、XML 配置</a></li>\n<li><a href=\"#2-java-config-recommend\">2、Java Config (Recommend)</a></li>\n<li><a href=\"#3-%E7%8B%AC%E7%AB%8B%E4%BD%BF%E7%94%A8\">3、独立使用</a></li>\n</ul>\n</li>\n<li><a href=\"#repo-%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AE%9E%E7%8E%B0\">Repo 的自定义实现</a>\n<ul>\n<li><a href=\"#%E5%AE%9A%E5%88%B6%E4%B8%AA%E4%BA%BArepo\">定制个人Repo</a></li>\n<li><a href=\"#2-%E8%87%AA%E5%AE%9A%E4%B9%89%E5%9F%BA%E7%A1%80repo\">2、自定义基础Repo</a></li>\n<li><a href=\"#%E6%9C%AA%E5%AE%8C%E5%BE%85%E7%BB%AD\">未完待续</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E5%AE%9E%E4%BD%93%E7%B1%BB-entity\">实体类 Entity</a>\n<ul>\n<li><a href=\"#1-entity-%E6%B3%A8%E8%A7%A3%E4%BF%AE%E9%A5%B0%E5%AE%9E%E4%BD%93%E7%B1%BB\">1、@Entity 注解修饰实体类</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2018-05-06 20:52:13","dateFormat":"2018-05-06"},{"fileName":"tinyspring-learnTwo-AOP","abstract":"<blockquote>\n<ul>\n<li>tinySpring学习笔记系列之二</li>\n<li>主要介绍AOP实现过程</li>\n<li>并介绍不同的动态代理方式</li>\n</ul>\n</blockquote>\n","description":" tinySpring学习笔记系列之二 主要介绍AOP实现过程 并介绍不同的动态代理方式 AOP及其实现 AOP分为配置(Pointcut，Advice)，织入(Weave)两部分工作，当然还有一部分是将AOP整合到整个容器的生...","title":"tinySpring学习笔记（二）-实现AOP","tags":[{"name":"Spring","slug":"spring","used":true,"link":"https://blog.shunzi.tech/tag/spring/"}],"feature":"","link":"https://blog.shunzi.tech/post/tinyspring-learnTwo-AOP/","stats":{"text":"14 min read","time":823000,"words":2902,"minutes":14},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#aop%E5%8F%8A%E5%85%B6%E5%AE%9E%E7%8E%B0\">AOP及其实现</a>\n<ul>\n<li><a href=\"#step1-%E4%BD%BF%E7%94%A8jdk%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0aop%E7%BB%87%E5%85%A5\">step1-使用JDK动态代理实现AOP织入</a>\n<ul>\n<li><a href=\"#aop-%E4%B8%AD%E4%B8%A4%E4%B8%AA%E9%87%8D%E8%A6%81%E8%A7%92%E8%89%B2methodinterceptor%E5%92%8Cmethodinvocation\">AOP 中两个重要角色：MethodInterceptor和MethodInvocation</a></li>\n<li><a href=\"#%E5%AE%9E%E7%8E%B0%E6%AD%A5%E9%AA%A4\">实现步骤：</a></li>\n</ul>\n</li>\n<li><a href=\"#step2-%E4%BD%BF%E7%94%A8aspectj%E7%AE%A1%E7%90%86%E5%88%87%E9%9D%A2\">step2-使用AspectJ管理切面</a>\n<ul>\n<li><a href=\"#%E5%AE%9E%E7%8E%B0%E6%B5%8B%E8%AF%95\">实现测试：</a></li>\n</ul>\n</li>\n<li><a href=\"#step3-%E5%B0%86aop%E8%9E%8D%E5%85%A5bean%E7%9A%84%E5%88%9B%E5%BB%BA%E8%BF%87%E7%A8%8B%E4%B8%AD\">step3-将AOP融入Bean的创建过程中</a><br>\n*\n<ul>\n<li><a href=\"#%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E7%9A%84%E6%AD%A5%E9%AA%A4\">动态代理的步骤</a></li>\n</ul>\n</li>\n<li><a href=\"#step4-%E4%BD%BF%E7%94%A8cglib%E8%BF%9B%E8%A1%8C%E7%B1%BB%E7%9A%84%E7%BB%87%E5%85%A5\">step4-使用CGLib进行类的织入</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2018-04-10 16:01:49","dateFormat":"2018-04-10"},{"fileName":"Head-Frist-Spring-Cloud","abstract":"<blockquote>\n<ul>\n<li>Spring Cloud一些基础概念</li>\n<li>介绍Spring Cloud的一些基本组件</li>\n<li>介绍一些组件的替代方案</li>\n</ul>\n</blockquote>\n","description":" Spring Cloud一些基础概念 介绍Spring Cloud的一些基本组件 介绍一些组件的替代方案 服务提供者和服务消费者 服务提供者：对应的进行相关数据库操作并向外界提供API接口 服务消费者：对应的消费服务提供者提供...","title":"Head Frist Spring Cloud","tags":[{"name":"Spring","slug":"spring","used":true,"link":"https://blog.shunzi.tech/tag/spring/"}],"feature":"","link":"https://blog.shunzi.tech/post/Head-Frist-Spring-Cloud/","stats":{"text":"3 min read","time":178000,"words":807,"minutes":3},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li>\n<ul>\n<li><a href=\"#%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E5%92%8C%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85\">服务提供者和服务消费者</a><br>\n*\n<ul>\n<li><a href=\"#%E5%AD%98%E5%9C%A8%E7%9A%84%E9%97%AE%E9%A2%98\">存在的问题：</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0%E5%92%8C%E6%B3%A8%E5%86%8C\">服务发现和注册</a>\n<ul>\n<li><a href=\"#eureka-%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0-enableeurekaserver\">Eureka 服务发现 @EnableEurekaServer</a></li>\n</ul>\n</li>\n<li><a href=\"#%E4%B8%A4%E7%A7%8D%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8%E6%96%B9%E5%BC%8F\">两种服务调用方式</a><br>\n*\n<ul>\n<li><a href=\"#ribbon-resttemplate\">Ribbon + RestTemplate</a></li>\n<li><a href=\"#feign\">Feign</a></li>\n</ul>\n</li>\n<li><a href=\"#feign-%E5%92%8C-ribbon-%E7%9A%84%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98\">Feign 和 Ribbon 的常见问题：</a>\n<ul>\n<li><a href=\"#hystrix%E7%9B%B8%E5%85%B3\">Hystrix相关：</a>\n<ul>\n<li><a href=\"#feign%E5%92%8Cribbon%E5%9C%A8%E6%95%B4%E5%90%88%E4%BA%86hystrix%E5%90%8E%E5%8F%AF%E8%83%BD%E4%BC%9A%E5%87%BA%E7%8E%B0%E9%A6%96%E6%AC%A1%E8%B0%83%E7%94%A8%E5%A4%B1%E8%B4%A5%E7%9A%84%E9%97%AE%E9%A2%98\">Feign和Ribbon在整合了Hystrix后，可能会出现首次调用失败的问题</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2018-02-06 20:32:20","dateFormat":"2018-02-06"},{"fileName":"apply-intern-java","abstract":"<blockquote>\n<ul>\n<li>2017年11月，为了2018年上半年的企业实习投递了一系列简历并参与了相关面试。</li>\n<li>主要分为Java篇，数据库篇，网络篇，框架篇，算法篇和相关工具篇</li>\n<li>当时无太多项目经验，一切都还是入门阶段</li>\n</ul>\n</blockquote>\n","description":" 2017年11月，为了2018年上半年的企业实习投递了一系列简历并参与了相关面试。 主要分为Java篇，数据库篇，网络篇，框架篇，算法篇和相关工具篇 当时无太多项目经验，一切都还是入门阶段 面试的岗位主要是Java后端开发实习...","title":"2017.11找实习-面经-Java","tags":[{"name":"面经","slug":"mian-jing","used":true,"link":"https://blog.shunzi.tech/tag/mian-jing/"}],"feature":"","link":"https://blog.shunzi.tech/post/apply-intern-java/","stats":{"text":"15 min read","time":849000,"words":3451,"minutes":15},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#-more-\"><!-- more --></a><br>\n*\n<ul>\n<li><a href=\"#%E6%AD%A4%E7%AF%87%E4%B8%BAjava%E7%AF%87%E6%8C%81%E7%BB%AD%E6%9B%B4%E6%96%B0ing\">此篇为Java篇，持续更新ing</a></li>\n</ul>\n</li>\n<li><a href=\"#1-java%E5%9F%BA%E6%9C%AC%E7%9F%A5%E8%AF%86\">1、Java基本知识</a>\n<ul>\n<li><a href=\"#%E5%AE%9E%E7%8E%B0%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%9A%84%E6%96%B9%E5%BC%8F\">实现多线程的方式</a></li>\n<li><a href=\"#list-map-set%E7%9A%84%E5%8C%BA%E5%88%AB%E5%92%8C%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6\">list、map、set的区别和应用场景（集合框架）</a><br>\n*<br>\n*<br>\n* <a href=\"#1%E5%AD%98%E6%94%BE\">1.存放</a><br>\n* <a href=\"#2%E5%8F%96%E5%87%BA\">2.取出</a>\n<ul>\n<li><a href=\"#list%E4%B8%AD%E7%9A%84%E7%9B%B8%E5%85%B3%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6arraylist-linkedlist-stack-vector\">List中的相关集合框架（ArrayList、LinkedList、Stack、Vector）</a>\n<ul>\n<li><a href=\"#linkedlist%E5%92%8Carraylist%E7%9A%84%E5%8C%BA%E5%88%AB\">linkedList和arrayList的区别</a></li>\n<li><a href=\"#arraylist-stack%E5%92%8Cvector%E7%9A%84%E4%B8%BB%E8%A6%81%E5%8C%BA%E5%88%AB\">ArrayList、Stack和Vector的主要区别</a></li>\n</ul>\n</li>\n<li><a href=\"#set%E7%9B%B8%E5%85%B3%E7%9A%84%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6hashset-treeset\">Set相关的集合框架（HashSet、TreeSet）</a><br>\n*\n<ul>\n<li><a href=\"#hashset-%E5%92%8C-treeset\">HashSet 和 TreeSet</a></li>\n<li><a href=\"#hashmap%E7%9A%84%E5%8E%9F%E7%90%86\">hashMap的原理</a></li>\n<li><a href=\"#hashtable%E7%9A%84%E5%8E%9F%E7%90%86\">hashTable的原理</a></li>\n<li><a href=\"#concurrenthashmap%E7%9A%84%E5%8E%9F%E7%90%86\">concurrentHashMap的原理</a></li>\n</ul>\n</li>\n<li><a href=\"#object%E4%B8%AD%E5%B8%B8%E7%94%A8%E7%9A%84%E6%96%B9%E6%B3%95\">Object中常用的方法</a>\n<ul>\n<li><a href=\"#hashcode\">hashCode</a></li>\n<li><a href=\"#equals-%E5%92%8C\">equals 和 ==</a>\n<ul>\n<li><a href=\"#\">==</a></li>\n<li><a href=\"#equals\">equals()</a></li>\n<li><a href=\"#%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF\">应用场景</a></li>\n</ul>\n</li>\n<li><a href=\"#clone\">clone</a></li>\n<li><a href=\"#tostring\">toString</a></li>\n</ul>\n</li>\n<li><a href=\"#java%E7%A8%8B%E5%BA%8F%E4%BB%8E%E7%BC%96%E5%86%99%E5%88%B0%E8%BF%90%E8%A1%8C%E7%9A%84%E5%85%A8%E8%BF%87%E7%A8%8B\">Java程序从编写到运行的全过程：</a>\n<ul>\n<li><a href=\"#%E7%AE%80%E5%8D%95%E6%8F%8F%E8%BF%B0\">简单描述</a></li>\n<li><a href=\"#%E4%B9%8B%E5%90%8E%E4%BC%9A%E7%BB%93%E5%90%88java%E5%86%85%E5%AD%98%E7%BB%93%E6%9E%84%E8%BF%9B%E8%A1%8C%E5%85%B7%E4%BD%93%E9%98%90%E9%87%8A-%E6%95%AC%E8%AF%B7%E6%9C%9F%E5%BE%85\">之后会结合Java内存结构进行具体阐释。敬请期待</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2017-12-21 20:13:04","dateFormat":"2017-12-21"},{"fileName":"transaction-and-lock","abstract":"<blockquote>\n<ul>\n<li>此篇博文主要是结合例子介绍数据库事务。</li>\n<li>同时介绍数据库相关锁协议。</li>\n<li>后续会对相关实现机制和核心思想进行深入探讨。</li>\n</ul>\n</blockquote>\n","description":" 此篇博文主要是结合例子介绍数据库事务。 同时介绍数据库相关锁协议。 后续会对相关实现机制和核心思想进行深入探讨。 事务的定义 事务（Transaction），一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各...","title":"事务和锁","tags":[{"name":"数据库","slug":"shu-ju-ku","used":true,"link":"https://blog.shunzi.tech/tag/shu-ju-ku/"}],"feature":"","link":"https://blog.shunzi.tech/post/transaction-and-lock/","stats":{"text":"8 min read","time":421000,"words":2021,"minutes":8},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li>\n<ul>\n<li><a href=\"#%E4%BA%8B%E5%8A%A1%E7%9A%84%E5%AE%9A%E4%B9%89\">事务的定义</a><br>\n*\n<ul>\n<li><a href=\"#%E7%AE%80%E8%80%8C%E8%A8%80%E4%B9%8B-%E4%BA%8B%E5%8A%A1transaction%E6%98%AF%E5%B9%B6%E5%8F%91%E6%8E%A7%E5%88%B6%E7%9A%84%E5%9F%BA%E6%9C%AC%E5%8D%95%E4%BD%8D\">简而言之： 事务（Transaction）是并发控制的基本单位。</a></li>\n</ul>\n</li>\n<li><a href=\"#%E4%BA%8B%E5%8A%A1%E7%9A%84%E7%89%B9%E7%82%B9-acid\">事务的特点 ACID</a></li>\n<li><a href=\"#%E4%BA%8B%E5%8A%A1%E5%AF%B9%E5%BA%94%E7%9A%84%E8%AF%AD%E5%8F%A5\">事务对应的语句</a></li>\n<li><a href=\"#%E4%BA%8B%E5%8A%A1%E5%B9%B6%E5%8F%91%E6%8E%A7%E5%88%B6\">事务并发控制</a>\n<ul>\n<li><a href=\"#%E4%BA%8B%E5%8A%A1%E4%B8%8D%E8%80%83%E8%99%91%E9%9A%94%E7%A6%BB%E6%80%A7%E5%BC%95%E5%8F%91%E7%9A%84%E9%97%AE%E9%A2%98\">事务不考虑隔离性引发的问题</a></li>\n<li><a href=\"#%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BA%8B%E5%8A%A1%E9%9A%94%E7%A6%BB%E7%BA%A7%E5%88%ABsql%E6%A0%87%E5%87%86%E5%AE%9A%E4%B9%89\">数据库事务隔离级别（SQL标准定义）</a></li>\n<li><a href=\"#%E6%95%B0%E6%8D%AE%E5%BA%93%E9%94%81\">数据库锁</a>\n<ul>\n<li><a href=\"#%E6%95%B0%E6%8D%AE%E5%BA%93%E9%94%81%E7%9A%84%E5%9F%BA%E6%9C%AC%E7%B1%BB%E5%9E%8B\">数据库锁的基本类型：</a></li>\n<li><a href=\"#%E4%B8%8D%E5%90%8C%E7%BA%A7%E5%88%AB%E7%9A%84%E5%8A%A0%E9%94%81%E5%8D%8F%E8%AE%AE\">不同级别的加锁协议</a>\n<ul>\n<li><a href=\"#%E5%85%B6%E4%BB%96%E5%8A%A0%E9%94%81%E5%8D%8F%E8%AE%AE\">其他加锁协议</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2017-12-21 20:13:04","dateFormat":"2017-12-21"},{"fileName":"arithmetic-sort-exercise-one","abstract":"<blockquote>\n<ul>\n<li>此篇博文主要是对面试过程中的算法题进行记录。</li>\n<li>该题作为面试常见题型，同时拥有多种实现方式。</li>\n<li>后续会对相关算法进行具体代码实现。</li>\n</ul>\n</blockquote>\n","description":" 此篇博文主要是对面试过程中的算法题进行记录。 该题作为面试常见题型，同时拥有多种实现方式。 后续会对相关算法进行具体代码实现。 题目描述： 有很多个无序的数，怎么选出其中最大的若干个数？即，从n个数中选出最大的K个数。 解法一:...","title":"常见算法之寻找K大数","tags":[{"name":"算法","slug":"suan-fa","used":true,"link":"https://blog.shunzi.tech/tag/suan-fa/"}],"feature":"","link":"https://blog.shunzi.tech/post/arithmetic-sort-exercise-one/","stats":{"text":"5 min read","time":245000,"words":1171,"minutes":5},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#%E9%A2%98%E7%9B%AE%E6%8F%8F%E8%BF%B0\">题目描述：</a><br>\n*<br>\n*<br>\n* <a href=\"#%E6%9C%89%E5%BE%88%E5%A4%9A%E4%B8%AA%E6%97%A0%E5%BA%8F%E7%9A%84%E6%95%B0%E6%80%8E%E4%B9%88%E9%80%89%E5%87%BA%E5%85%B6%E4%B8%AD%E6%9C%80%E5%A4%A7%E7%9A%84%E8%8B%A5%E5%B9%B2%E4%B8%AA%E6%95%B0%E5%8D%B3%E4%BB%8En%E4%B8%AA%E6%95%B0%E4%B8%AD%E9%80%89%E5%87%BA%E6%9C%80%E5%A4%A7%E7%9A%84k%E4%B8%AA%E6%95%B0\">有很多个无序的数，怎么选出其中最大的若干个数？即，从n个数中选出最大的K个数。</a></li>\n<li><a href=\"#%E8%A7%A3%E6%B3%95%E4%B8%80\">解法一:</a><br>\n*<br>\n*<br>\n*<br>\n* <a href=\"#%E5%85%83%E7%B4%A0%E6%95%B0%E9%87%8F%E4%B8%8D%E5%A4%9A%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E4%BD%BF%E7%94%A8%E5%AF%B9%E5%BA%94%E7%9A%84%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95%E6%9D%A5%E5%AF%B9%E6%95%B0%E6%8D%AE%E8%BF%9B%E8%A1%8C%E6%8E%92%E5%BA%8F%E5%86%8D%E8%BE%93%E5%87%BA%E6%9C%80%E5%A4%A7%E7%9A%84%E5%89%8Dk%E4%B8%AA%E6%95%B0\">元素数量不多的情况下，使用对应的排序算法来对数据进行排序，再输出最大的前K个数。</a>\n<ul>\n<li><a href=\"#%E4%B8%A4%E7%A7%8D%E6%8E%92%E5%BA%8F%E9%83%A8%E5%88%86%E6%8E%92%E5%BA%8F%E5%85%A8%E9%83%A8%E6%8E%92%E5%BA%8F\">两种排序（部分排序，全部排序）</a>\n<ul>\n<li><a href=\"#%E5%85%A8%E9%83%A8%E6%8E%92%E5%BA%8F-%E6%97%B6%E9%97%B4%E5%A4%8D%E6%9D%82%E5%BA%A6%E5%9D%87%E4%B8%BAonlog2n\">全部排序：( 时间复杂度均为O(Nlog2N) )</a>\n<ul>\n<li><a href=\"#%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F\">快速排序：</a></li>\n<li><a href=\"#%E5%A0%86%E6%8E%92%E5%BA%8F\">堆排序：</a></li>\n<li><a href=\"#%E5%AD%98%E5%9C%A8%E7%9A%84%E9%97%AE%E9%A2%98\">存在的问题：</a></li>\n</ul>\n</li>\n<li><a href=\"#%E9%83%A8%E5%88%86%E6%8E%92%E5%BA%8F%E6%8A%8An%E4%B8%AA%E6%95%B0%E4%B8%AD%E7%9A%84%E5%89%8Dk%E4%B8%AA%E6%95%B0%E6%8E%92%E5%BA%8F%E5%87%BA%E6%9D%A5%E5%A4%8D%E6%9D%82%E5%BA%A6%E6%98%AFonk\">部分排序：把n个数中的前K个数排序出来，复杂度是O(N*K)。</a>\n<ul>\n<li><a href=\"#%E9%80%89%E6%8B%A9%E6%8E%92%E5%BA%8F\">选择排序：</a></li>\n<li><a href=\"#%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F\">冒泡排序：</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E7%BB%93%E8%AE%BA\">结论:</a></li>\n</ul>\n</li>\n<li><a href=\"#%E8%A7%A3%E6%B3%95%E4%BA%8C\">解法二</a><br>\n*\n<ul>\n<li><a href=\"#%E5%88%A9%E7%94%A8%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F%E7%9A%84%E6%80%9D%E6%83%B3\">利用快速排序的思想</a>\n<ul>\n<li><a href=\"#%E5%BF%AB%E6%8E%92%E5%9B%9E%E9%A1%BE\">快排回顾：</a></li>\n<li><a href=\"#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88\">解决方案：</a></li>\n<li><a href=\"#%E7%BB%93%E8%AE%BA-2\">结论：</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E8%A7%A3%E6%B3%95%E4%B8%89%E9%83%A8%E5%88%86%E5%A0%86%E6%8E%92%E5%BA%8F%E5%AE%9E%E7%8E%B0\">解法三（部分堆排序实现）</a><br>\n*<br>\n*<br>\n* <a href=\"#%E6%AD%A5%E9%AA%A4%E6%A6%82%E6%8B%AC%E6%89%80%E8%80%97%E8%B4%B9%E7%9A%84%E6%97%B6%E9%97%B4%E5%A4%8D%E6%9D%82%E5%BA%A6%E4%B8%BAon-k\">步骤概括：所耗费的时间复杂度为O(n * K)。</a><br>\n* <a href=\"#%E5%AF%B9%E4%BA%8E%E5%AF%BB%E6%89%BE%E6%9C%80%E5%B0%8F%E5%80%BC%E4%BB%A5%E5%8F%8A%E6%9B%BF%E6%8D%A2%E7%9A%84%E9%97%AE%E9%A2%98\">对于寻找最小值以及替换的问题</a><br>\n* <a href=\"#%E5%A0%86%E6%8E%92%E5%BA%8F%E5%AE%9E%E7%8E%B0\">堆排序实现：</a><br>\n* <a href=\"#%E5%90%8E%E7%BB%AD%E4%BC%9A%E7%94%A8%E7%9B%B8%E5%85%B3%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0-%E6%95%AC%E8%AF%B7%E6%9C%9F%E5%BE%85\">后续会用相关代码实现。敬请期待！  :)</a></li>\n</ul>\n</li>\n</ul>\n","date":"2017-12-13 20:13:04","dateFormat":"2017-12-13"},{"fileName":"redis-data-structure-two","abstract":"<blockquote>\n<ul>\n<li>此篇博文主要是结合命令行工具介绍Redis数据类型。</li>\n<li>Redis基础知识篇。</li>\n<li>后续会对相关实现机制和核心思想进行深入探讨。</li>\n</ul>\n</blockquote>\n","description":" 此篇博文主要是结合命令行工具介绍Redis数据类型。 Redis基础知识篇。 后续会对相关实现机制和核心思想进行深入探讨。 Redis支持五种数据类型：string（字符串），hash（哈希），list（列表），set（集合）及...","title":"Redis数据类型","tags":[{"name":"Redis","slug":"redis","used":true,"link":"https://blog.shunzi.tech/tag/redis/"}],"feature":"","link":"https://blog.shunzi.tech/post/redis-data-structure-two/","stats":{"text":"9 min read","time":505000,"words":1840,"minutes":9},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li>\n<ul>\n<li>\n<ul>\n<li><a href=\"#string\">string</a></li>\n<li><a href=\"#hash\">Hash</a></li>\n<li><a href=\"#list\">List</a>\n<ul>\n<li><a href=\"#%E5%B8%B8%E7%94%A8%E4%BA%8E%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97%E7%9A%84%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF\">常用于消息队列的使用场景</a></li>\n</ul>\n</li>\n<li><a href=\"#set\">Set</a>\n<ul>\n<li><a href=\"#%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF\">应用场景</a></li>\n</ul>\n</li>\n<li><a href=\"#zset-sorted-set%E6%9C%89%E5%BA%8F%E9%9B%86%E5%90%88\">zset (sorted set：有序集合)</a>\n<ul>\n<li><a href=\"#%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF-2\">应用场景：</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2017-12-07 20:00:29","dateFormat":"2017-12-07"},{"fileName":"redis-start-one","abstract":"<blockquote>\n<ul>\n<li>此篇博文主要是记录Redis安装过程。</li>\n<li>对于其他相关介绍，可参考相应博客。</li>\n<li>可能会因为版本差异，步骤稍有不同，但都大同小异。</li>\n</ul>\n</blockquote>\n","description":" 此篇博文主要是记录Redis安装过程。 对于其他相关介绍，可参考相应博客。 可能会因为版本差异，步骤稍有不同，但都大同小异。 1、为什么使用Redis？ MySQL为代表的关系型数据库在web2.0时代出现一系列效率低下，可扩展...","title":"Redis安装与配置","tags":[{"name":"Redis","slug":"redis","used":true,"link":"https://blog.shunzi.tech/tag/redis/"}],"feature":"","link":"https://blog.shunzi.tech/post/redis-start-one/","stats":{"text":"9 min read","time":520000,"words":2233,"minutes":9},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#1-%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%BF%E7%94%A8redis\">1、为什么使用Redis？</a></li>\n<li><a href=\"#redis%E7%9B%B8%E5%85%B3%E5%91%BD%E4%BB%A4\">Redis相关命令</a><br>\n*<br>\n*<br>\n* <a href=\"#redis%E9%80%9A%E7%94%A8%E5%91%BD%E4%BB%A4\">Redis通用命令</a></li>\n<li><a href=\"#redis%E7%9A%84%E5%AE%89%E8%A3%85%E5%90%AF%E5%8A%A8\">Redis的安装启动</a><br>\n*\n<ul>\n<li><a href=\"#windows%E4%B8%8B\"><code>windows</code>下</a></li>\n<li><a href=\"#linux%E4%B8%8B\"><code>linux</code>下</a></li>\n</ul>\n</li>\n<li><a href=\"#redis%E7%9A%84%E9%85%8D%E7%BD%AE\">Redis的配置</a></li>\n</ul>\n</li>\n</ul>\n","date":"2017-12-07 20:00:29","dateFormat":"2017-12-07"},{"fileName":"tinySpring-learnOne-IOC","abstract":"<blockquote>\n<ul>\n<li>tinySpring 是一个模仿Spring框架的迷你项目。</li>\n<li>通过理解和实现相关代码，掌握Spring的核心思想。</li>\n<li>后续会对Spring本身的一些实现再做深入探讨。</li>\n</ul>\n</blockquote>\n","description":" tinySpring 是一个模仿Spring框架的迷你项目。 通过理解和实现相关代码，掌握Spring的核心思想。 后续会对Spring本身的一些实现再做深入探讨。 为了更好的理解Spring的核心思想（IOC和AOP），开始阅...","title":"tinySpring学习笔记（一）-实现IOC容器","tags":[{"name":"Spring","slug":"spring","used":true,"link":"https://blog.shunzi.tech/tag/spring/"}],"feature":"","link":"https://blog.shunzi.tech/post/tinySpring-learnOne-IOC/","stats":{"text":"13 min read","time":747000,"words":2686,"minutes":13},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li>\n<ul>\n<li><a href=\"#step1-%E6%9C%80%E5%9F%BA%E6%9C%AC%E7%9A%84%E5%AE%B9%E5%99%A8\">step1-最基本的容器</a>\n<ul>\n<li><a href=\"#ioc%E6%9C%80%E5%9F%BA%E6%9C%AC%E7%9A%84%E7%BB%84%E6%88%90beanfactory-%E5%92%8C-bean%E5%AE%B9%E5%99%A8%E5%92%8C%E5%AE%9E%E4%BD%93\">IOC最基本的组成：BeanFactory 和 Bean（容器和实体）</a></li>\n<li><a href=\"#%E5%AE%9E%E7%8E%B0%E6%AD%A5%E9%AA%A4\">实现步骤：</a></li>\n</ul>\n</li>\n<li><a href=\"#step2-%E5%B0%86bean%E5%88%9B%E5%BB%BA%E6%94%BE%E5%85%A5%E5%B7%A5%E5%8E%82\">step2-将Bean创建放入工厂</a>\n<ul>\n<li><a href=\"#%E5%AE%9E%E7%8E%B0%E6%AD%A5%E9%AA%A4%E7%9B%B8%E6%AF%94step1%E5%8C%BA%E5%88%AB%E4%BB%85%E5%9C%A8%E4%BA%8E-%E5%88%9D%E5%A7%8B%E5%8C%96beanfactory%E5%92%8C%E6%B3%A8%E5%85%A5bean\">实现步骤：（相比step1区别仅在于 ==初始化BeanFactory和注入Bean==）</a></li>\n</ul>\n</li>\n<li><a href=\"#step3-%E4%B8%BAbean%E6%B3%A8%E5%85%A5%E5%B1%9E%E6%80%A7\">step3-为Bean注入属性</a>\n<ul>\n<li><a href=\"#%E5%AE%9E%E7%8E%B0%E6%AD%A5%E9%AA%A4-2\">实现步骤：</a></li>\n</ul>\n</li>\n<li><a href=\"#step4-%E8%AF%BB%E5%8F%96xml%E9%85%8D%E7%BD%AE%E6%9D%A5%E5%88%9D%E5%A7%8B%E5%8C%96bean\">step4-读取xml配置来初始化bean</a>\n<ul>\n<li><a href=\"#%E5%AE%9E%E7%8E%B0%E6%AD%A5%E9%AA%A4-3\">实现步骤：</a></li>\n</ul>\n</li>\n<li><a href=\"#step5-%E4%B8%BAbean%E6%B3%A8%E5%85%A5bean%E5%A4%84%E7%90%86bean%E4%B9%8B%E9%97%B4%E7%9A%84%E4%BE%9D%E8%B5%96\">step5-为bean注入bean（处理Bean之间的依赖）</a>\n<ul>\n<li><a href=\"#%E5%AE%9E%E7%8E%B0%E6%AD%A5%E9%AA%A4-4\">实现步骤：</a></li>\n</ul>\n</li>\n<li><a href=\"#step6-applicationcontext\">step6-ApplicationContext</a>\n<ul>\n<li><a href=\"#%E5%AE%9E%E7%8E%B0%E6%AD%A5%E9%AA%A4-5\">实现步骤：</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2017-11-18 16:01:49","dateFormat":"2017-11-18"},{"fileName":"Servlet-apply-two","abstract":"<blockquote>\n<ul>\n<li>此篇博文主要是结合JavaEE基础知识了解原理。</li>\n<li>提供常见的例子实现来介绍现代JavaWeb框架的本质。</li>\n<li>后续会结合相关框架实现进行深入探讨。</li>\n</ul>\n</blockquote>\n","description":" 此篇博文主要是结合JavaEE基础知识了解原理。 提供常见的例子实现来介绍现代JavaWeb框架的本质。 后续会结合相关框架实现进行深入探讨。 文件上传： 原理（Servlet） 通过使用文件上传下载组件，通过读取请求中的文件的...","title":"Servlet常用用法（二）-文件上传下载","tags":[{"name":"JavaWeb","slug":"javaweb","used":true,"link":"https://blog.shunzi.tech/tag/javaweb/"}],"feature":"","link":"https://blog.shunzi.tech/post/Servlet-apply-two/","stats":{"text":"6 min read","time":334000,"words":1309,"minutes":6},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li>\n<ul>\n<li><a href=\"#%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0\">文件上传：</a>\n<ul>\n<li><a href=\"#%E5%8E%9F%E7%90%86servlet\">原理（Servlet）</a></li>\n<li><a href=\"#%E6%A1%86%E6%9E%B6%E5%AF%B9%E5%BA%94%E7%9A%84%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E6%96%B9%E6%B3%95\">框架对应的文件上传方法</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%96%87%E4%BB%B6%E4%B8%8B%E8%BD%BD\">文件下载：</a>\n<ul>\n<li><a href=\"#%E5%8E%9F%E7%90%86servlet-2\">原理（Servlet）</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E4%B8%8B%E8%BD%BD%E8%BF%87%E7%A8%8B%E4%B8%AD%E5%AF%B9%E5%BA%94%E7%9A%84%E6%96%87%E4%BB%B6%E8%B7%AF%E5%BE%84%E7%9A%84%E9%97%AE%E9%A2%98\">文件上传下载过程中对应的文件路径的问题</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2017-11-02 21:28:52","dateFormat":"2017-11-02"},{"fileName":"Servlet-apply-one","abstract":"<blockquote>\n<ul>\n<li>该系列博文主要是介绍JavaEE基础知识。</li>\n<li>结合当初项目实例，介绍几种Servlet的具体应用</li>\n<li>后续会解析相关JavaWeb框架的具体实现原理。</li>\n</ul>\n</blockquote>\n","description":" 该系列博文主要是介绍JavaEE基础知识。 结合当初项目实例，介绍几种Servlet的具体应用 后续会解析相关JavaWeb框架的具体实现原理。 1、Servlet编写过滤器(Filter) Servlet 过滤器 可以动态地拦...","title":"Servlet常用用法（一）","tags":[{"name":"JavaWeb","slug":"javaweb","used":true,"link":"https://blog.shunzi.tech/tag/javaweb/"}],"feature":"","link":"https://blog.shunzi.tech/post/Servlet-apply-one/","stats":{"text":"7 min read","time":379000,"words":1664,"minutes":7},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li><a href=\"#1-servlet%E7%BC%96%E5%86%99%E8%BF%87%E6%BB%A4%E5%99%A8filter\">1、<code>Servlet</code>编写过滤器(<code>Filter</code>)</a><br>\n*<br>\n*<br>\n* <a href=\"#%E8%AF%B7%E6%B1%82%E9%A2%84%E5%A4%84%E7%90%86\">请求预处理：</a><br>\n* <a href=\"#%E5%93%8D%E5%BA%94%E5%90%8E%E5%A4%84%E7%90%86\">响应后处理：</a>\n<ul>\n<li><a href=\"#%E5%88%86%E7%B1%BB\">分类</a></li>\n<li><a href=\"#filter%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F\">Filter的生命周期</a></li>\n</ul>\n</li>\n<li><a href=\"#2-servlet-%E8%B7%9F%E8%B8%AAsession\">2、<code>Servlet</code> 跟踪<code>Session</code></a><br>\n*\n<ul>\n<li><a href=\"#%E7%BB%B4%E6%8C%81%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%92%8C%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B9%8B%E9%97%B4%E7%9A%84session%E4%BC%9A%E8%AF%9D%E7%9A%84%E6%96%B9%E5%BC%8F\">维持客户端和服务器之间的<code>session</code>会话的方式：</a></li>\n<li><a href=\"#%E5%88%A0%E9%99%A4session%E4%BC%9A%E8%AF%9D%E6%95%B0%E6%8D%AE\">删除<code>Session</code>会话数据</a><br>\n*\n<ul>\n<li><a href=\"#%E5%BD%93%E6%82%A8%E5%AE%8C%E6%88%90%E4%BA%86%E4%B8%80%E4%B8%AA%E7%94%A8%E6%88%B7%E7%9A%84-session-%E4%BC%9A%E8%AF%9D%E6%95%B0%E6%8D%AE%E6%82%A8%E6%9C%89%E4%BB%A5%E4%B8%8B%E5%87%A0%E7%A7%8D%E9%80%89%E6%8B%A9\">当您完成了一个用户的 session 会话数据，您有以下几种选择：</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2017-11-01 21:28:52","dateFormat":"2017-11-01"},{"fileName":"VerifyCode-Java","abstract":"<blockquote>\n<ul>\n<li>此篇博文源于对验证码的机制好奇从而想一探究竟。</li>\n<li>此处只介绍了最简单的字符型验证码实现，其他高级验证码机制更为复杂。</li>\n<li>后续结合相关图像识别技术和自动化技术介绍验证码的攻与防。</li>\n</ul>\n</blockquote>\n","description":" 此篇博文源于对验证码的机制好奇从而想一探究竟。 此处只介绍了最简单的字符型验证码实现，其他高级验证码机制更为复杂。 后续结合相关图像识别技术和自动化技术介绍验证码的攻与防。 验证码Java实现 1、Servlet实现验证码 实现...","title":"验证码Java实现","tags":[{"name":"JavaWeb","slug":"javaweb","used":true,"link":"https://blog.shunzi.tech/tag/javaweb/"}],"feature":"","link":"https://blog.shunzi.tech/post/VerifyCode-Java/","stats":{"text":"2 min read","time":105000,"words":407,"minutes":2},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li><a href=\"#%E9%AA%8C%E8%AF%81%E7%A0%81java%E5%AE%9E%E7%8E%B0\">验证码Java实现</a>\n<ul>\n<li><a href=\"#1-servlet%E5%AE%9E%E7%8E%B0%E9%AA%8C%E8%AF%81%E7%A0%81\">1、<code>Servlet</code>实现验证码</a>\n<ul>\n<li><a href=\"#%E5%AE%9E%E7%8E%B0%E6%AD%A5%E9%AA%A4\">实现步骤:</a></li>\n<li><a href=\"#%E6%A0%B8%E5%BF%83%E4%BB%A3%E7%A0%81%E9%AA%8C%E8%AF%81%E7%A0%81%E7%9A%84%E7%94%9F%E6%88%90\">核心代码：（验证码的生成）</a></li>\n</ul>\n</li>\n<li><a href=\"#2-%E6%8F%92%E4%BB%B6%E5%AE%9E%E7%8E%B0%E9%AA%8C%E8%AF%81%E7%A0%81\">2、插件实现验证码：</a></li>\n<li><a href=\"#3-java%E5%9B%BE%E7%89%87%E9%AA%8C%E8%AF%81%E7%A0%81\">3、Java图片验证码</a></li>\n</ul>\n</li>\n</ul>\n","date":"2017-10-29 21:28:52","dateFormat":"2017-10-29"},{"fileName":"Servlet-basic","abstract":"<blockquote>\n<ul>\n<li>该系列博文主要是介绍JavaEE基础知识。</li>\n<li>可以结合相关Web应用容器技术进行食用。（Tomcat）</li>\n<li>后续会解析相关JavaWeb框架的具体实现原理。</li>\n</ul>\n</blockquote>\n","description":" 该系列博文主要是介绍JavaEE基础知识。 可以结合相关Web应用容器技术进行食用。（Tomcat） 后续会解析相关JavaWeb框架的具体实现原理。 1、什么是Servlet？ Java Servlet 是运行在 Web 服务...","title":"Servlet基础知识","tags":[{"name":"JavaWeb","slug":"javaweb","used":true,"link":"https://blog.shunzi.tech/tag/javaweb/"}],"feature":"","link":"https://blog.shunzi.tech/post/Servlet-basic/","stats":{"text":"9 min read","time":532000,"words":2314,"minutes":9},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li><a href=\"#1-%E4%BB%80%E4%B9%88%E6%98%AFservlet\">1、什么是<code>Servlet</code>？</a></li>\n<li><a href=\"#2-servlet%E6%9E%B6%E6%9E%84\">2、<code>Servlet</code>架构</a></li>\n<li><a href=\"#3-servlet%E5%A3%B0%E6%98%8E%E5%91%A8%E6%9C%9F\">3、<code>Servlet</code>声明周期</a></li>\n<li><a href=\"#4-servlet%E8%8E%B7%E5%8F%96%E8%AF%B7%E6%B1%82%E5%A4%B4%E4%BF%A1%E6%81%AF\">4、<code>Servlet</code>获取请求头信息</a></li>\n<li><a href=\"#5-%E8%AE%BE%E7%BD%AEhttp%E5%93%8D%E5%BA%94%E6%8A%A5%E5%A4%B4%E7%9A%84%E6%96%B9%E6%B3%95\">5、设置<code>HTTP</code>响应报头的方法</a></li>\n<li><a href=\"#6-servlet%E4%B8%AD%E7%9A%84http%E7%8A%B6%E6%80%81%E7%A0%81\">6、<code>Servlet</code>中的<code>HTTP</code>状态码</a>\n<ul>\n<li><a href=\"#%E8%AF%B7%E6%B1%82%E6%8A%A5%E6%96%87%E5%92%8C%E5%93%8D%E5%BA%94%E6%8A%A5%E6%96%87%E7%9A%84%E6%A0%BC%E5%BC%8F\">请求报文和响应报文的格式</a><br>\n*<br>\n*<br>\n* <a href=\"#%E4%BE%8B%E5%AD%90%E5%A6%82%E4%B8%8B\">例子如下：</a></li>\n<li><a href=\"#%E8%AE%BE%E7%BD%AE-http-%E7%8A%B6%E6%80%81%E4%BB%A3%E7%A0%81%E7%9A%84%E6%96%B9%E6%B3%95\">设置 HTTP 状态代码的方法</a></li>\n</ul>\n</li>\n</ul>\n","date":"2017-10-28 21:28:52","dateFormat":"2017-10-28"},{"fileName":"Docker-cmd","abstract":"<blockquote>\n<ul>\n<li>该系列博文主要是记录Docker学习过程中使用到的一些命令。</li>\n<li>部分命令可能会因Docker版本不同有所差异</li>\n<li>后续会不断更新。</li>\n</ul>\n</blockquote>\n","description":" 该系列博文主要是记录Docker学习过程中使用到的一些命令。 部分命令可能会因Docker版本不同有所差异 后续会不断更新。 1、安装与启动、更新 安装Docker : apt-get install -y docker.io ...","title":"Docker常用命令","tags":[{"name":"服务器","slug":"fu-wu-qi","used":true,"link":"https://blog.shunzi.tech/tag/fu-wu-qi/"}],"feature":"","link":"https://blog.shunzi.tech/post/Docker-cmd/","stats":{"text":"3 min read","time":138000,"words":570,"minutes":3},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#1-%E5%AE%89%E8%A3%85%E4%B8%8E%E5%90%AF%E5%8A%A8-%E6%9B%B4%E6%96%B0\">1、安装与启动、更新</a></li>\n<li><a href=\"#2-%E9%95%9C%E5%83%8F-%E5%AE%B9%E5%99%A8%E7%9B%B8%E5%85%B3\">2、镜像、容器相关</a>\n<ul>\n<li><a href=\"#%E9%95%9C%E5%83%8F-images\">镜像 images</a></li>\n<li><a href=\"#%E5%AE%B9%E5%99%A8-containers\">容器 containers</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2017-10-24 20:32:20","dateFormat":"2017-10-24"},{"fileName":"Docker-start","abstract":"<blockquote>\n<ul>\n<li>该系列博文主要是介绍Docker的一些基本概念。</li>\n<li>学习笔记，仅此而已</li>\n<li>后续...。</li>\n</ul>\n</blockquote>\n","description":" 该系列博文主要是介绍Docker的一些基本概念。 学习笔记，仅此而已 后续...。 1、什么是Docker？ Docker是一个开源的引擎，可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试...","title":"Docker入门笔记","tags":[{"name":"服务器","slug":"fu-wu-qi","used":true,"link":"https://blog.shunzi.tech/tag/fu-wu-qi/"},{"name":"容器","slug":"X-lnqf1Ex","used":true,"link":"https://blog.shunzi.tech/tag/X-lnqf1Ex/"}],"feature":"","link":"https://blog.shunzi.tech/post/Docker-start/","stats":{"text":"4 min read","time":182000,"words":817,"minutes":4},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#1-%E4%BB%80%E4%B9%88%E6%98%AFdocker\">1、什么是Docker？</a></li>\n<li><a href=\"#2-docker%E7%9A%84%E7%BB%84%E6%88%90\">2、Docker的组成</a></li>\n<li><a href=\"#3-docker%E5%9C%A8%E5%AE%B9%E5%99%A8%E4%B8%AD%E5%AE%89%E8%A3%85%E6%96%B0%E7%9A%84%E7%A8%8B%E5%BA%8F\">3、Docker在容器中安装新的程序</a></li>\n<li><a href=\"#4-%E4%BF%9D%E5%AD%98%E5%AF%B9%E5%AE%B9%E5%99%A8%E7%9A%84%E4%BF%AE%E6%94%B9\">4、保存对容器的修改</a></li>\n<li><a href=\"#5-%E5%88%9B%E5%BB%BA%E9%95%9C%E5%83%8F\">5、创建镜像</a></li>\n<li><a href=\"#6-%E6%9E%84%E5%BB%BA%E9%95%9C%E5%83%8F\">6、构建镜像</a></li>\n</ul>\n</li>\n</ul>\n","date":"2017-10-24 20:32:20","dateFormat":"2017-10-24"},{"fileName":"tomcat-one","abstract":"<blockquote>\n<ul>\n<li>该系列博文主要是介绍Web应用容器的一些原理。</li>\n<li>结合JavaEE的基础只是，介绍核心思想和实现机制</li>\n<li>介绍容器中其他组件，系列一。</li>\n</ul>\n</blockquote>\n","description":" 该系列博文主要是介绍Web应用容器的一些原理。 结合JavaEE的基础只是，介绍核心思想和实现机制 介绍容器中其他组件，系列一。 前言 1、Servlet容器是如何工作的？ 创建一个Request对象，用可能会在Servlet中...","title":"深入剖析Tomcat读书笔记（一）","tags":[{"name":"服务器","slug":"fu-wu-qi","used":true,"link":"https://blog.shunzi.tech/tag/fu-wu-qi/"},{"name":"WEB容器","slug":"KyMCZj2Wl","used":true,"link":"https://blog.shunzi.tech/tag/KyMCZj2Wl/"}],"feature":"https://1.bp.blogspot.com/-FJN5mv7udjk/WdYQhsxOOUI/AAAAAAAAAU0/0a1mgN6N0-c4sgbuLHYOyU9yK0tbhpJeACLcBGAs/s728-e100/apache-tomcat-rce-exploit.png","link":"https://blog.shunzi.tech/post/tomcat-one/","stats":{"text":"9 min read","time":535000,"words":2435,"minutes":9},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li><a href=\"#%E5%89%8D%E8%A8%80\">前言</a>\n<ul>\n<li><a href=\"#1-servlet%E5%AE%B9%E5%99%A8%E6%98%AF%E5%A6%82%E4%BD%95%E5%B7%A5%E4%BD%9C%E7%9A%84\">1、Servlet容器是如何工作的？</a>\n<ul>\n<li><a href=\"#%E5%A4%8D%E4%B9%A0servlet%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F\">复习Servlet的生命周期</a></li>\n</ul>\n</li>\n<li><a href=\"#2-catalina\">2、Catalina</a></li>\n</ul>\n</li>\n<li><a href=\"#%E7%AC%AC%E4%B8%80%E7%AB%A0-%E7%AE%80%E5%8D%95%E7%9A%84web%E6%9C%8D%E5%8A%A1%E5%99%A8\">第一章 简单的Web服务器</a>\n<ul>\n<li><a href=\"#web%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86\">WEB服务器的工作原理</a></li>\n<li><a href=\"#%E5%9C%A8%E7%BC%96%E5%86%99%E8%BF%87%E7%A8%8B%E4%B8%AD%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98%E5%BE%85%E8%A7%A3%E5%86%B3\">在编写过程中遇到的问题：(待解决)</a>\n<ul>\n<li><a href=\"#%E7%BC%96%E5%86%99%E4%BB%A3%E7%A0%81%E6%97%B6%E6%8A%9B%E5%87%BA%E5%BC%82%E5%B8%B8\">编写代码时抛出异常：</a></li>\n<li><a href=\"#%E6%B5%8B%E8%AF%95%E8%BF%87%E7%A8%8B%E4%B8%AD%E5%AD%98%E5%9C%A8%E7%9A%84%E9%97%AE%E9%A2%98\">测试过程中存在的问题：</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84servlet%E5%AE%B9%E5%99%A8\">第二章 一个简单的Servlet容器</a>\n<ul>\n<li><a href=\"#servlet%E5%AE%B9%E5%99%A8%E7%9A%84%E6%90%AD%E5%BB%BA\">Servlet容器的搭建</a>\n<ul>\n<li><a href=\"#new%E5%85%B3%E9%94%AE%E5%AD%97-%E5%92%8C-newinstance%E5%AE%9E%E4%BE%8B%E5%8C%96%E7%9A%84%E5%8C%BA%E5%88%AB\">new关键字 和 newInstance实例化的区别</a></li>\n<li><a href=\"#servletservertwo%E7%9B%B8%E6%AF%94servletseverone\">ServletServerTwo相比ServletSeverOne</a>\n<ul>\n<li><a href=\"#%E5%A4%96%E8%A7%82%E6%A8%A1%E5%BC%8F\">外观模式</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#%E8%BF%9E%E6%8E%A5%E5%99%A8\">连接器</a>\n<ul>\n<li><a href=\"#stringmanager\">StringManager</a></li>\n<li><a href=\"#httpconnector\">HttpConnector</a></li>\n<li><a href=\"#httpprocessor\">HttpProcessor</a>\n<ul>\n<li><a href=\"#%E4%B8%BB%E8%A6%81%E4%BB%BB%E5%8A%A1\">主要任务</a></li>\n<li><a href=\"#%E8%A7%A3%E6%9E%90http%E8%AF%B7%E6%B1%82\">解析<code>HTTP</code>请求：</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2017-10-19 21:28:52","dateFormat":"2017-10-19"},{"fileName":"Adapter","abstract":"<blockquote>\n<ul>\n<li>该系列博文主要是介绍一些常用的设计模式。</li>\n<li>此处仅使用了Java语言来进行示例，设计模式是一种思想，不受预言限制</li>\n<li>结合一些具体的例子对适配器模式进行讲解。</li>\n</ul>\n</blockquote>\n","description":" 该系列博文主要是介绍一些常用的设计模式。 此处仅使用了Java语言来进行示例，设计模式是一种思想，不受预言限制 结合一些具体的例子对适配器模式进行讲解。 适配器模式 将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由...","title":"适配器模式","tags":[{"name":"设计模式","slug":"she-ji-mo-shi","used":true,"link":"https://blog.shunzi.tech/tag/she-ji-mo-shi/"}],"feature":"","link":"https://blog.shunzi.tech/post/Adapter/","stats":{"text":"2 min read","time":92000,"words":359,"minutes":2},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li><a href=\"#%E9%80%82%E9%85%8D%E5%99%A8%E6%A8%A1%E5%BC%8F\">适配器模式</a></li>\n</ul>\n</li>\n</ul>\n","date":"2017-10-06 20:32:20","dateFormat":"2017-10-06"},{"fileName":"Java.String","abstract":"<blockquote>\n<ul>\n<li>该博文主要是介绍字符串处理过程中一些常用的函数和操作。</li>\n<li>结合Java本身封装的字符串库来讲解</li>\n<li>对于部分操作的效率进行对比，探讨性能问题</li>\n</ul>\n</blockquote>\n","description":" 该博文主要是介绍字符串处理过程中一些常用的函数和操作。 结合Java本身封装的字符串库来讲解 对于部分操作的效率进行对比，探讨性能问题 Java.String String 类的两种赋值方式 String 可以表示出一个字符串...","title":"Java.String","tags":[{"name":"JavaSE","slug":"javase","used":true,"link":"https://blog.shunzi.tech/tag/javase/"}],"feature":"","link":"https://blog.shunzi.tech/post/Java.String/","stats":{"text":"14 min read","time":815000,"words":2444,"minutes":14},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li><a href=\"#javastring\">Java.String</a><br>\n*\n<ul>\n<li><a href=\"#string-%E7%B1%BB%E7%9A%84%E4%B8%A4%E7%A7%8D%E8%B5%8B%E5%80%BC%E6%96%B9%E5%BC%8F\">String 类的两种赋值方式</a></li>\n<li><a href=\"#string%E7%B1%BB%E7%BC%96%E8%AF%91%E6%9C%9F%E4%B8%8E%E8%BF%90%E8%A1%8C%E6%9C%9F%E5%88%86%E6%9E%90\">String类编译期与运行期分析</a></li>\n<li><a href=\"#string-%E7%B1%BB%E5%AD%97%E7%AC%A6%E4%B8%8E%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%93%8D%E4%BD%9C%E6%96%B9%E6%B3%95\">String 类字符与字符串操作方法</a></li>\n</ul>\n</li>\n</ul>\n","date":"2017-05-06 16:57:41","dateFormat":"2017-05-06"},{"fileName":"os-one","abstract":"<blockquote>\n<ul>\n<li>该系列博文主要是针对操作系统课程中的一些知识点进行梳理。</li>\n<li>更多地是介绍相关概念，后续会结合部分代码介绍</li>\n<li>操作系统系列之一</li>\n</ul>\n</blockquote>\n","description":" 该系列博文主要是针对操作系统课程中的一些知识点进行梳理。 更多地是介绍相关概念，后续会结合部分代码介绍 操作系统系列之一 第一章 操作系统引论 1.1 操作系统的目标及作用 1.1.1 操作系统的概念 An Operating...","title":"操作系统引论","tags":[{"name":"OS","slug":"os","used":true,"link":"https://blog.shunzi.tech/tag/os/"}],"feature":"","link":"https://blog.shunzi.tech/post/os-one/","stats":{"text":"16 min read","time":906000,"words":4283,"minutes":16},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li><a href=\"#%E7%AC%AC%E4%B8%80%E7%AB%A0-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%BC%95%E8%AE%BA\">第一章 操作系统引论</a><br>\n*\n<ul>\n<li><a href=\"#11-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%9A%84%E7%9B%AE%E6%A0%87%E5%8F%8A%E4%BD%9C%E7%94%A8\">1.1 操作系统的目标及作用</a>\n<ul>\n<li><a href=\"#111-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%9A%84%E6%A6%82%E5%BF%B5\">1.1.1 操作系统的概念</a></li>\n<li><a href=\"#112-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%9A%84%E4%BD%8D%E7%BD%AE\">1.1.2 操作系统的位置</a></li>\n<li><a href=\"#113-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%9A%84%E7%9B%AE%E6%A0%87\">1.1.3 操作系统的目标</a></li>\n<li><a href=\"#114-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%9A%84%E4%BD%9C%E7%94%A8\">1.1.4 操作系统的作用</a></li>\n</ul>\n</li>\n<li><a href=\"#12-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%8F%91%E5%B1%95%E5%8E%86%E7%A8%8B-%E4%BA%86%E8%A7%A3\">1.2 操作系统的发展历程 *(了解)</a>\n<ul>\n<li><a href=\"#121-%E6%97%A0%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%9A%84%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F\">1.2.1 无操作系统的计算机系统</a>\n<ul>\n<li><a href=\"#1211-%E4%BA%BA%E5%B7%A5%E6%93%8D%E4%BD%9C%E6%96%B9%E5%BC%8F20%E4%B8%96%E7%BA%AA50%E5%B9%B4%E4%BB%A3\">1.2.1.1 人工操作方式（20世纪50年代）</a></li>\n<li><a href=\"#1212-%E8%84%B1%E6%9C%BA%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E6%96%B9%E5%BC%8F\">1.2.1.2 脱机输入/输出方式</a></li>\n</ul>\n</li>\n<li><a href=\"#122-%E5%8D%95%E9%81%93%E6%89%B9%E5%A4%84%E7%90%86%E7%B3%BB%E7%BB%9F\">1.2.2 单道批处理系统</a></li>\n<li><a href=\"#123-%E5%A4%9A%E9%81%93%E6%89%B9%E5%A4%84%E7%90%86%E7%B3%BB%E7%BB%9F\">1.2.3 多道批处理系统</a></li>\n<li><a href=\"#124-%E5%88%86%E6%97%B6%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-%E9%87%8D%E8%A6%81\">1.2.4 分时操作系统 (重要)</a></li>\n<li><a href=\"#125-%E5%AE%9E%E6%97%B6%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-%E9%87%8D%E8%A6%81\">1.2.5 实时操作系统 （重要）</a></li>\n<li><a href=\"#126-%E5%BE%AE%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F\">1.2.6 微机操作系统</a></li>\n</ul>\n</li>\n<li><a href=\"#13-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%9F%BA%E6%9C%AC%E7%89%B9%E6%80%A7-%E9%87%8D%E8%A6%81\">1.3 操作系统的基本特性 （重要）</a>\n<ul>\n<li><a href=\"#131-%E5%B9%B6%E5%8F%91%E6%80%A7\">1.3.1 并发性</a></li>\n<li><a href=\"#132-%E5%85%B1%E4%BA%AB\">1.3.2 共享</a>\n<ul>\n<li><a href=\"#1321-%E4%BA%92%E6%96%A5%E5%85%B1%E4%BA%AB\">1.3.2.1 互斥共享</a></li>\n<li><a href=\"#1322-%E5%90%8C%E6%97%B6%E8%AE%BF%E9%97%AE%E6%96%B9%E5%BC%8F\">1.3.2.2 同时访问方式</a></li>\n</ul>\n</li>\n<li><a href=\"#133-%E8%99%9A%E6%8B%9F%E6%80%A7\">1.3.3 虚拟性</a></li>\n<li><a href=\"#134-%E5%BC%82%E6%AD%A5%E6%80%A7-%E6%98%93%E9%94%99\">1.3.4 异步性 （易错）</a></li>\n</ul>\n</li>\n<li><a href=\"#14-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%9A%84%E4%B8%BB%E8%A6%81%E5%8A%9F%E8%83%BD\">1.4 操作系统的主要功能</a>\n<ul>\n<li><a href=\"#141-%E5%A4%84%E7%90%86%E6%9C%BA%E7%AE%A1%E7%90%86%E5%8A%9F%E8%83%BD\">1.4.1 处理机管理功能</a>\n<ul>\n<li><a href=\"#1411-%E8%BF%9B%E7%A8%8B%E6%8E%A7%E5%88%B6\">1.4.1.1 进程控制</a></li>\n<li><a href=\"#1412-%E8%BF%9B%E7%A8%8B%E5%90%8C%E6%AD%A5%E5%92%8C%E4%BA%92%E6%96%A5\">1.4.1.2 进程同步和互斥</a>\n<ul>\n<li><a href=\"#14121-%E8%BF%9B%E7%A8%8B%E4%BA%92%E6%96%A5%E6%96%B9%E5%BC%8F\">1.4.1.2.1 进程互斥方式</a></li>\n<li><a href=\"#14122-%E8%BF%9B%E7%A8%8B%E5%90%8C%E6%AD%A5%E6%96%B9%E5%BC%8F\">1.4.1.2.2 进程同步方式</a></li>\n</ul>\n</li>\n<li><a href=\"#1413%E8%BF%9B%E7%A8%8B%E9%80%9A%E4%BF%A1\">1.4.1.3进程通信</a></li>\n<li><a href=\"#1414-%E8%B0%83%E5%BA%A6\">1.4.1.4 调度</a></li>\n</ul>\n</li>\n<li><a href=\"#142-%E5%AD%98%E5%82%A8%E5%99%A8%E7%AE%A1%E7%90%86%E5%8A%9F%E8%83%BD\">1.4.2 存储器管理功能</a>\n<ul>\n<li><a href=\"#1421-%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D\">1.4.2.1 内存分配</a>\n<ul>\n<li><a href=\"#14211-%E9%9D%99%E6%80%81%E5%88%86%E9%85%8D%E6%96%B9%E5%BC%8F\">1.4.2.1.1 静态分配方式</a></li>\n<li><a href=\"#14212-%E5%8A%A8%E6%80%81%E5%88%86%E9%85%8D%E6%96%B9%E5%BC%8F\">1.4.2.1.2 动态分配方式</a></li>\n</ul>\n</li>\n<li><a href=\"#1422-%E5%86%85%E5%AD%98%E4%BF%9D%E6%8A%A4\">1.4.2.2 内存保护</a></li>\n<li><a href=\"#1423-%E5%9C%B0%E5%9D%80%E6%98%A0%E5%B0%84\">1.4.2.3 地址映射</a></li>\n<li><a href=\"#1424-%E5%86%85%E5%AD%98%E6%89%A9%E5%85%85\">1.4.2.4 内存扩充</a></li>\n<li><a href=\"#143-%E8%AE%BE%E5%A4%87%E7%AE%A1%E7%90%86%E5%8A%9F%E8%83%BD\">1.4.3 设备管理功能</a></li>\n<li><a href=\"#144-%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86%E5%8A%9F%E8%83%BD\">1.4.4 文件管理功能</a></li>\n<li><a href=\"#145-%E6%96%B9%E4%BE%BF%E7%94%A8%E6%88%B7%E4%BD%BF%E7%94%A8%E7%9A%84%E7%94%A8%E6%88%B7%E6%8E%A5%E5%8F%A3\">1.4.5 方便用户使用的用户接口</a>\n<ul>\n<li><a href=\"#%E7%94%A8%E6%88%B7%E6%8E%A5%E5%8F%A3\">用户接口</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#15-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%9A%84%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84\">1.5 操作系统的体系结构</a>\n<ul>\n<li><a href=\"#151-%E6%97%A0%E7%BB%93%E6%9E%84%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F\">1.5.1 无结构操作系统</a></li>\n<li><a href=\"#152-%E6%A8%A1%E5%9D%97%E5%8C%96os%E7%BB%93%E6%9E%84\">1.5.2 模块化OS结构</a></li>\n<li><a href=\"#153-%E5%88%86%E5%B1%82%E5%BC%8Fos%E7%BB%93%E6%9E%84\">1.5.3 分层式OS结构</a></li>\n<li><a href=\"#154-%E5%BE%AE%E5%86%85%E6%A0%B8os%E7%BB%93%E6%9E%84\">1.5.4 微内核OS结构</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2017-05-01 20:32:20","dateFormat":"2017-05-01"},{"fileName":"os-two","abstract":"<blockquote>\n<ul>\n<li>该系列博文主要是针对操作系统课程中的一些知识点进行梳理。</li>\n<li>更多地是介绍相关概念，后续会结合部分代码介绍</li>\n<li>操作系统系列之二</li>\n</ul>\n</blockquote>\n","description":" 该系列博文主要是针对操作系统课程中的一些知识点进行梳理。 更多地是介绍相关概念，后续会结合部分代码介绍 操作系统系列之二 第二章 进程的描述与控制 2.1 程序执行 2.1.1 程序顺序执行 特征： 顺序性：处理机的操作严格...","title":"进程的描述与控制","tags":[{"name":"OS","slug":"os","used":true,"link":"https://blog.shunzi.tech/tag/os/"}],"feature":"","link":"https://blog.shunzi.tech/post/os-two/","stats":{"text":"15 min read","time":848000,"words":4069,"minutes":15},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li><a href=\"#%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%BF%9B%E7%A8%8B%E7%9A%84%E6%8F%8F%E8%BF%B0%E4%B8%8E%E6%8E%A7%E5%88%B6\">第二章 进程的描述与控制</a><br>\n*\n<ul>\n<li><a href=\"#21-%E7%A8%8B%E5%BA%8F%E6%89%A7%E8%A1%8C\">2.1 程序执行</a>\n<ul>\n<li><a href=\"#211-%E7%A8%8B%E5%BA%8F%E9%A1%BA%E5%BA%8F%E6%89%A7%E8%A1%8C\">2.1.1 程序顺序执行</a></li>\n<li><a href=\"#212-%E7%A8%8B%E5%BA%8F%E5%B9%B6%E5%8F%91%E6%89%A7%E8%A1%8C\">2.1.2 程序并发执行</a></li>\n</ul>\n</li>\n<li><a href=\"#22-%E8%BF%9B%E7%A8%8B%E7%9A%84%E6%8F%8F%E8%BF%B0\">2.2 进程的描述</a>\n<ul>\n<li><a href=\"#221-%E8%BF%9B%E7%A8%8B%E7%9A%84%E5%AE%9A%E4%B9%89%E5%92%8C%E7%89%B9%E5%BE%81\">2.2.1 进程的定义和特征</a>\n<ul>\n<li><a href=\"#2211-%E5%85%B8%E5%9E%8B%E7%9A%84%E8%BF%9B%E7%A8%8B%E5%AE%9A%E4%B9%89%E6%9C%89\">2.2.1.1 典型的进程定义有：</a></li>\n<li><a href=\"#2212-%E8%BF%9B%E7%A8%8B%E7%9A%84%E7%BB%93%E6%9E%84\">2.2.1.2 进程的结构</a></li>\n<li><a href=\"#2213-%E8%BF%9B%E7%A8%8B%E7%9A%84%E7%89%B9%E5%BE%81-%E9%87%8D%E8%A6%81\">2.2.1.3 进程的特征 (重要)</a></li>\n</ul>\n</li>\n<li><a href=\"#222-%E8%BF%9B%E7%A8%8B%E7%9A%84%E5%9F%BA%E6%9C%AC%E7%8A%B6%E6%80%81%E5%8F%8A%E8%BD%AC%E6%8D%A2-%E9%87%8D%E8%A6%81\">2.2.2 进程的基本状态及转换 （重要）</a></li>\n<li><a href=\"#223-%E6%8C%82%E8%B5%B7%E6%93%8D%E4%BD%9C%E5%92%8C%E8%BF%9B%E7%A8%8B%E7%8A%B6%E6%80%81%E7%9A%84%E8%BD%AC%E6%8D%A2\">2.2.3 挂起操作和进程状态的转换</a></li>\n<li><a href=\"#224-%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86%E4%B8%AD%E7%9A%84%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84\">2.2.4 进程管理中的数据结构</a>\n<ul>\n<li><a href=\"#2241-%E8%BF%9B%E7%A8%8B%E6%8E%A7%E5%88%B6%E5%9D%97%E7%9A%84%E4%BD%9C%E7%94%A8\">2.2.4.1 进程控制块的作用</a></li>\n<li><a href=\"#2242-%E8%BF%9B%E7%A8%8B%E6%8E%A7%E5%88%B6%E5%9D%97%E7%9A%84%E5%86%85%E5%AE%B9\">2.2.4.2 进程控制块的内容</a></li>\n<li><a href=\"#2243-%E8%BF%9B%E7%A8%8B%E6%8E%A7%E5%88%B6%E5%9D%97%E7%9A%84%E7%BB%84%E7%BB%87%E6%96%B9%E5%BC%8F\">2.2.4.3 进程控制块的组织方式</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#23-%E8%BF%9B%E7%A8%8B%E6%8E%A7%E5%88%B6\">2.3 进程控制</a>\n<ul>\n<li><a href=\"#231-%E5%8E%9F%E8%AF%AD\">2.3.1 原语</a></li>\n<li><a href=\"#232-%E8%BF%9B%E7%A8%8B%E7%9A%84%E5%88%9B%E5%BB%BA\">2.3.2 进程的创建</a>\n<ul>\n<li><a href=\"#2321-%E8%BF%9B%E7%A8%8B%E5%9B%BEprocess-graph\">2.3.2.1 进程图（Process  Graph）</a></li>\n<li><a href=\"#2322-%E5%BC%95%E8%B5%B7%E5%88%9B%E5%BB%BA%E8%BF%9B%E7%A8%8B%E7%9A%84%E4%BA%8B%E4%BB%B6\">2.3.2.2 引起创建进程的事件</a></li>\n</ul>\n</li>\n<li><a href=\"#233-%E8%BF%9B%E7%A8%8B%E7%9A%84%E7%BB%88%E6%AD%A2\">2.3.3 进程的终止</a></li>\n<li><a href=\"#234-%E8%BF%9B%E7%A8%8B%E7%9A%84%E9%98%BB%E5%A1%9E%E4%B8%8E%E5%94%A4%E9%86%92\">2.3.4 进程的阻塞与唤醒</a></li>\n<li><a href=\"#235-%E8%BF%9B%E7%A8%8B%E7%9A%84%E6%8C%82%E8%B5%B7%E5%92%8C%E6%BF%80%E6%B4%BB\">2.3.5 进程的挂起和激活</a></li>\n</ul>\n</li>\n<li><a href=\"#24-%E8%BF%9B%E7%A8%8B%E7%9A%84%E5%90%8C%E6%AD%A5\">2.4 进程的同步</a>\n<ul>\n<li><a href=\"#241-%E8%BF%9B%E7%A8%8B%E7%9A%84%E5%90%8C%E6%AD%A5%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5\">2.4.1 进程的同步的基本概念</a></li>\n<li><a href=\"#242\">2.4.2</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2017-05-01 20:32:20","dateFormat":"2017-05-01"},{"fileName":"java-one","abstract":"<blockquote>\n<ul>\n<li>该博文主要是简单记录Java的一些基本知识</li>\n<li>更多地是介绍相关概念，后续会结合部分代码介绍</li>\n<li>会结合部分内存虚拟机的知识加深概念理解</li>\n</ul>\n</blockquote>\n","description":" 该博文主要是简单记录Java的一些基本知识 更多地是介绍相关概念，后续会结合部分代码介绍 会结合部分内存虚拟机的知识加深概念理解 Java体系架构 JavaSE : Java Standard Edition JavaEE : ...","title":"Java基本常识","tags":[{"name":"JavaSE","slug":"javase","used":true,"link":"https://blog.shunzi.tech/tag/javase/"}],"feature":"https://blog.shunzi.tech/post-images/java-one.jpg","link":"https://blog.shunzi.tech/post/java-one/","stats":{"text":"27 min read","time":1599000,"words":6851,"minutes":27},"isTop":false,"toc":"<ul class=\"markdownIt-TOC\">\n<li>\n<ul>\n<li>\n<ul>\n<li><a href=\"#java%E4%BD%93%E7%B3%BB%E6%9E%B6%E6%9E%84\">Java体系架构</a></li>\n<li><a href=\"#java%E8%AF%AD%E8%A8%80%E7%9A%84%E7%89%B9%E7%82%B9\">Java语言的特点</a></li>\n<li><a href=\"#java%E8%B7%A8%E5%B9%B3%E5%8F%B0%E7%9A%84%E5%8E%9F%E7%90%86\">Java跨平台的原理</a></li>\n<li><a href=\"#jvm-java%E8%99%9A%E6%8B%9F%E6%9C%BA\">JVM Java虚拟机</a></li>\n<li><a href=\"#%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E5%99%A8\">垃圾回收器</a></li>\n<li><a href=\"#javase-%E7%9A%84%E7%BB%84%E6%88%90%E6%A6%82%E5%BF%B5%E5%9B%BE\">JavaSE 的组成概念图</a></li>\n<li><a href=\"#%E6%95%B0%E7%BB%84%E5%86%85%E5%AD%98%E7%BB%93%E6%9E%84%E5%88%86%E6%9E%90\">数组内存结构分析</a></li>\n<li><a href=\"#%E5%A4%9A%E7%BB%B4%E6%95%B0%E7%BB%84\">多维数组</a></li>\n<li><a href=\"#%E5%AF%B9%E8%B1%A1%E4%B8%8E%E5%86%85%E5%AD%98%E5%88%86%E6%9E%90\">对象与内存分析</a>\n<ul>\n<li><a href=\"#new-%E5%85%B3%E9%94%AE%E5%AD%97%E6%B7%B1%E5%85%A5\">new 关键字深入</a></li>\n<li><a href=\"#%E5%AF%B9%E8%B1%A1%E5%86%85%E5%AD%98%E5%88%86%E6%9E%90\">对象内存分析</a></li>\n</ul>\n</li>\n<li><a href=\"#%E6%9E%84%E9%80%A0%E6%96%B9%E6%B3%95\">构造方法</a></li>\n<li><a href=\"#%E6%96%B9%E6%B3%95%E9%87%8D%E8%BD%BD-ovrloading-method\">方法重载 ovrloading method</a></li>\n<li><a href=\"#%E5%8C%BF%E5%90%8D%E5%AF%B9%E8%B1%A1\">匿名对象</a></li>\n<li><a href=\"#%E5%80%BC%E4%BC%A0%E9%80%92%E4%B8%8E%E5%BC%95%E7%94%A8%E4%BC%A0%E9%80%92\">值传递与引用传递</a></li>\n<li><a href=\"#static%E5%85%B3%E9%94%AE%E5%AD%97\">static关键字</a></li>\n<li><a href=\"#main%E6%96%B9%E6%B3%95\">main方法</a></li>\n<li><a href=\"#%E5%AF%B9%E8%B1%A1%E6%95%B0%E7%BB%84\">对象数组</a></li>\n<li><a href=\"#foreach-%E4%B8%8E%E5%8F%AF%E5%8F%98%E5%8F%82%E6%95%B0-jdk15\">foreach 与可变参数  jdk1.5</a></li>\n<li><a href=\"#%E4%BB%A3%E7%A0%81%E5%9D%97\">代码块</a></li>\n<li><a href=\"#%E5%8D%95%E4%BE%8B%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F\">单例设计模式</a></li>\n<li><a href=\"#%E7%BB%A7%E6%89%BF\">继承</a></li>\n<li><a href=\"#%E5%AD%90%E7%B1%BB%E7%9A%84%E5%AE%9E%E4%BE%8B%E5%8C%96%E8%BF%87%E7%A8%8B\">子类的实例化过程</a></li>\n<li><a href=\"#%E6%96%B9%E6%B3%95%E7%9A%84%E9%87%8D%E5%86%99\">方法的重写</a></li>\n<li><a href=\"#super%E5%85%B3%E9%94%AE%E5%AD%97\">super关键字</a></li>\n<li><a href=\"#final%E5%85%B3%E9%94%AE%E5%AD%97\">final关键字</a></li>\n<li><a href=\"#%E6%8A%BD%E8%B1%A1%E7%B1%BB\">抽象类</a></li>\n<li><a href=\"#%E6%8E%A5%E5%8F%A3\">接口</a></li>\n<li><a href=\"#%E5%A4%9A%E6%80%81\">多态</a></li>\n<li><a href=\"#%E5%BC%BA%E5%88%B6%E8%BD%AC%E6%8D%A2\">强制转换</a></li>\n<li><a href=\"#instanceof%E5%85%B3%E9%94%AE%E5%AD%97\">instanceof关键字</a></li>\n<li><a href=\"#%E6%8A%BD%E8%B1%A1%E7%B1%BB%E5%BA%94%E7%94%A8\">抽象类应用</a></li>\n<li><a href=\"#%E6%8E%A5%E5%8F%A3%E5%BA%94%E7%94%A8\">接口应用</a></li>\n<li><a href=\"#object%E7%B1%BB\">Object类</a></li>\n<li><a href=\"#%E7%AE%80%E5%8D%95%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F\">简单工厂模式</a></li>\n<li><a href=\"#%E9%9D%99%E6%80%81%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F\">静态代理模式</a></li>\n<li><a href=\"#%E9%80%82%E9%85%8D%E5%99%A8%E6%A8%A1%E5%BC%8F\">适配器模式</a></li>\n<li><a href=\"#%E5%86%85%E9%83%A8%E7%B1%BB\">内部类</a>\n<ul>\n<li><a href=\"#%E5%86%85%E9%83%A8%E7%B1%BB%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5\">内部类的基本概念</a></li>\n<li><a href=\"#%E5%9C%A8%E5%A4%96%E9%83%A8%E5%88%9B%E5%BB%BA%E5%86%85%E9%83%A8%E7%B1%BB%E5%AF%B9%E8%B1%A1\">在外部创建内部类对象</a></li>\n<li><a href=\"#%E6%96%B9%E6%B3%95%E5%86%85%E9%83%A8%E7%B1%BB\">方法内部类</a></li>\n<li><a href=\"#%E9%9D%99%E6%80%81%E5%86%85%E9%83%A8%E7%B1%BB\">静态内部类</a></li>\n<li><a href=\"#%E5%8C%BF%E5%90%8D%E5%86%85%E9%83%A8%E7%B1%BB\">匿名内部类</a></li>\n<li><a href=\"#%E5%86%85%E9%83%A8%E7%B1%BB%E7%9A%84%E4%BD%9C%E7%94%A8\">内部类的作用</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n","date":"2017-04-30 00:55:13","dateFormat":"2017-04-30"},{"fileName":"One quarter","abstract":"<blockquote>\n<ul>\n<li>大一结束的暑假写的一些总结和规划</li>\n<li>更多地是胡言乱语吧，随笔记录</li>\n<li>应该会有后续吧</li>\n</ul>\n</blockquote>\n","description":" 大一结束的暑假写的一些总结和规划 更多地是胡言乱语吧，随笔记录 应该会有后续吧 小时候一直都在幻想自己长大后的光彩模样，也渐渐认清自己到底什么样。不断长大，经历越来越多的事情，走到不同阶段，不同的心态，不同的为人处世。也慢慢地也...","title":"四分之一","tags":[{"index":-1,"name":"Diary","slug":"diary","used":true,"link":"https://blog.shunzi.tech/tag/diary/"}],"feature":"https://github.com/zjs1224522500/files-and-images/blob/master/blog/pic/scientific_space_planet_galaxy_stars_mac_ox_ultrahd_4k_wallpaper_3840x2160.jpg?raw=true","link":"https://blog.shunzi.tech/post/One quarter/","stats":{"text":"7 min read","time":415000,"words":2076,"minutes":7},"isTop":false,"toc":"","date":"2016-06-30 20:32:20","dateFormat":"2016-06-30"}],"tags":[{"name":"编程语言","slug":"n2w6bz87h","used":true,"link":"https://blog.shunzi.tech/tag/n2w6bz87h/","count":5},{"name":"存储","slug":"3zCwFWPHxH","used":true,"link":"https://blog.shunzi.tech/tag/3zCwFWPHxH/","count":52},{"name":"读书笔记","slug":"la-n8a0mo","used":true,"link":"https://blog.shunzi.tech/tag/la-n8a0mo/","count":14},{"name":"OS","slug":"os","used":true,"link":"https://blog.shunzi.tech/tag/os/","count":16},{"name":"Paper","slug":"5uQUdLlSC","used":true,"link":"https://blog.shunzi.tech/tag/5uQUdLlSC/","count":18},{"name":"LSM","slug":"_jfuTNqah","used":true,"link":"https://blog.shunzi.tech/tag/_jfuTNqah/","count":10},{"name":"工具","slug":"hbaTDSglx-","used":true,"link":"https://blog.shunzi.tech/tag/hbaTDSglx-/","count":4},{"name":"Linux","slug":"EO3XpMf_y","used":true,"link":"https://blog.shunzi.tech/tag/EO3XpMf_y/","count":3},{"name":"cs-course","slug":"wAFV_pvXZ","used":true,"link":"https://blog.shunzi.tech/tag/wAFV_pvXZ/","count":2},{"name":6.824,"slug":"VqiGqmxbod","used":true,"link":"https://blog.shunzi.tech/tag/VqiGqmxbod/","count":1},{"name":"分布式","slug":"geK0jEW-T","used":true,"link":"https://blog.shunzi.tech/tag/geK0jEW-T/","count":12},{"name":"KVS","slug":"l8sKsLUAi","used":true,"link":"https://blog.shunzi.tech/tag/l8sKsLUAi/","count":1},{"name":"缓存","slug":"9msH-lUaA","used":true,"link":"https://blog.shunzi.tech/tag/9msH-lUaA/","count":6},{"name":"Ceph","slug":"i2b42Y2j6","used":true,"link":"https://blog.shunzi.tech/tag/i2b42Y2j6/","count":8},{"name":"一致性","slug":"oBVOD8v4ou","used":true,"link":"https://blog.shunzi.tech/tag/oBVOD8v4ou/","count":1},{"name":"AI","slug":"gqgftpk_y","used":true,"link":"https://blog.shunzi.tech/tag/gqgftpk_y/","count":1},{"name":"数据库","slug":"shu-ju-ku","used":true,"link":"https://blog.shunzi.tech/tag/shu-ju-ku/","count":4},{"name":"对象存储","slug":"ZnIN9Ge-w","used":true,"link":"https://blog.shunzi.tech/tag/ZnIN9Ge-w/","count":4},{"name":"云计算","slug":"4zx4ysLGro","used":true,"link":"https://blog.shunzi.tech/tag/4zx4ysLGro/","count":2},{"name":"SSD","slug":"Y_nsOD1At","used":true,"link":"https://blog.shunzi.tech/tag/Y_nsOD1At/","count":1},{"name":"虚拟化","slug":"E2d1yYZcV8","used":true,"link":"https://blog.shunzi.tech/tag/E2d1yYZcV8/","count":1},{"index":0,"name":"Ph.D","slug":"PhD","used":true,"link":"https://blog.shunzi.tech/tag/PhD/","count":1},{"name":"网络","slug":"ZqEqvRTvl","used":true,"link":"https://blog.shunzi.tech/tag/ZqEqvRTvl/","count":3},{"name":"仿真","slug":"PuY19cs53","used":true,"link":"https://blog.shunzi.tech/tag/PuY19cs53/","count":1},{"name":"系统结构","slug":"rIIc9E-ZvN","used":true,"link":"https://blog.shunzi.tech/tag/rIIc9E-ZvN/","count":1},{"name":"服务器","slug":"fu-wu-qi","used":true,"link":"https://blog.shunzi.tech/tag/fu-wu-qi/","count":4},{"name":"容器","slug":"X-lnqf1Ex","used":true,"link":"https://blog.shunzi.tech/tag/X-lnqf1Ex/","count":2},{"name":"C语言","slug":"5h7k39FKw","used":true,"link":"https://blog.shunzi.tech/tag/5h7k39FKw/","count":2},{"index":-1,"name":"Diary","slug":"diary","used":true,"link":"https://blog.shunzi.tech/tag/diary/","count":3},{"name":"计算机基础","slug":"DyzFtOe6x","used":true,"link":"https://blog.shunzi.tech/tag/DyzFtOe6x/","count":1},{"name":"OpenStack","slug":"oqE3oKihb","used":true,"link":"https://blog.shunzi.tech/tag/oqE3oKihb/","count":1},{"name":"中间件","slug":"p_z7gKe6R","used":true,"link":"https://blog.shunzi.tech/tag/p_z7gKe6R/","count":1},{"index":-1,"name":"测试","slug":"Test","used":true,"link":"https://blog.shunzi.tech/tag/Test/","count":1},{"index":-1,"name":"Product Standard","slug":"Product-Standard","used":true,"link":"https://blog.shunzi.tech/tag/Product-Standard/","count":1},{"name":"Spring","slug":"spring","used":true,"link":"https://blog.shunzi.tech/tag/spring/","count":5},{"name":"设计模式","slug":"she-ji-mo-shi","used":true,"link":"https://blog.shunzi.tech/tag/she-ji-mo-shi/","count":3},{"name":"面经","slug":"mian-jing","used":true,"link":"https://blog.shunzi.tech/tag/mian-jing/","count":1},{"name":"算法","slug":"suan-fa","used":true,"link":"https://blog.shunzi.tech/tag/suan-fa/","count":1},{"name":"Redis","slug":"redis","used":true,"link":"https://blog.shunzi.tech/tag/redis/","count":2},{"name":"JavaWeb","slug":"javaweb","used":true,"link":"https://blog.shunzi.tech/tag/javaweb/","count":4},{"name":"WEB容器","slug":"KyMCZj2Wl","used":true,"link":"https://blog.shunzi.tech/tag/KyMCZj2Wl/","count":1},{"name":"JavaSE","slug":"javase","used":true,"link":"https://blog.shunzi.tech/tag/javase/","count":2}],"menus":[{"index":0,"link":"/archives","name":"归档","openType":"Internal"},{"index":1,"link":"/tag/diary","name":"随笔","openType":"Internal"},{"index":null,"link":"/movies","name":"观影","openType":"Internal"},{"index":2,"link":"/post/about","name":"关于","openType":"Internal"}],"themeConfig":{"themeName":"breek","postPageSize":9,"archivesPageSize":50,"siteName":"Elvis Zhang","siteDescription":"The easy way or the right way.","footerInfo":"Powered by <a href=\"https://github.com/getgridea/gridea\" target=\"_blank\">Gridea</a>","showFeatureImage":true,"domain":"https://blog.shunzi.tech","postUrlFormat":"SLUG","tagUrlFormat":"SHORT_ID","dateFormat":"YYYY-MM-DD","feedFullText":true,"feedCount":10,"archivesPath":"archives","postPath":"post","tagPath":"tag"},"customConfig":{"bmdbSecret":"c4BReGHjJ8ptiiQihh7RcqP3GZmr8E6CJXtG9ZRGJtk3rMvMBg3jrfLK0tKhX47i","customCss":"","featureImage":"\\media\\images\\custom-featureImage.jpg","feed":"","footerLogo":"\\media\\images\\custom-footerLogo.jpg","friends":[],"github":"https://github.com/zjs1224522500","headerLogo":"\\media\\images\\custom-headerLogo.jpg","instagram":"","jsdelivr":true,"pageBgColor":"","repository":"zjs1224522500.github.io","telegram":"","twitter":"https://twitter.com/1224522500Elvis","username":"zjs1224522500","valineID":"Pj5H1z0w7hJlLGJpGBh9NrCq-MdYXbMMI","valineKey":"LdR8vK5EaBfK87esF7tlbsXe","visitors":true},"utils":{"now":1620954331293}}
